首页 > 试题广场 >

把字符串转换成整数

[编程题]把字符串转换成整数
  • 热度指数:507858 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0

数据范围:字符串长度满足
进阶:空间复杂度 ,时间复杂度

注意:
①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0
②字符串中可能出现 +/- 且仅可能出现在字符串首位。

输入描述:
输入一个字符串,包括数字字母符号,可以为空


输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1

输入

"+2147483647"

输出

2147483647
示例2

输入

"1a33"

输出

0
import java.util.*;
public class Solution {
    public int StrToInt(String str) {
        char[] ch = str.toCharArray();
        if (ch == null || ch.length == 0) {
            return 0;
        }

        int flag = 1;
        if ( ch[0] == '-') {
            flag = -1;
            ch[0] = '0';
        } else if (ch[0] == '+') {
            flag = 1;
            ch[0] = '0';
        }

        int sum = 0;
        for (int i = 0; i < ch.length; i++) {
            if (ch[i] < '0' || ch[i] > '9') {
                sum = 0;
                break;
            }
            sum = 10 * sum + ch[i] - '0';
        }
        return sum * flag;
    }
}

发表于 2023-08-09 03:26:09 回复(0)
import java.util.*;
public class Solution {
    public int StrToInt(String str) {
        if(str==null||str.equals("")){ //若为空或者为空字符则无效
            return 0;
        }
        int count=0; //最后的数字
        int n=1;//每一次的乘数,先是从1开始
        int flg=1;//默认为1,代表正数,只要最后返回 count*flg即可
        char[] contrast={'0','1','2','3','4','5','6','7','8','9'};//对比转换string和int的数组
        String str1="";

        //先拿到下标0处的元素
        if(str.charAt(0)=='+'){
            //为正数,不变
        } else if (str.charAt(0)=='-'){
            flg=-1; //为负数
        } else if (str.charAt(0)>='0'&&str.charAt(0)<='9') { //为数字
            str1+=str.charAt(0); //下标0处是数字,则拼接到str1上去
        }else {  //不合法元素

            return 0; //下标0处的元素为字符,使用返回0
        }

        for(int i=1;i<str.length();i++){  //先得到数字,从1下标开始,因为0已经判断了
           if (str.charAt(i)>='0'&&str.charAt(i)<='9'){ //是数字则拼接
               str1+=str.charAt(i);
           }else {
               return 0;//遇到字符,返回0
           }
        }
        //上面已经得到了我们想要的数字字符串了,在str1里面
        for (int i=str1.length()-1;i>=0;i--){ //从最后拿取每一个数据
            for (int j=0;j<contrast.length;j++){ //遍历对照数组,相等的时候,拿的到下标就是当前字符对应的数字
                if(str1.charAt(i)==contrast[j]){  //数据对上了
                    count+=j*n;//最后一位的值
                    n*=10; //为接下来的一位做准备
                    break;  //跳出对比的循环
                }

            }

        }



        return count*flg;
    }
}

发表于 2023-06-28 20:21:03 回复(0)
public class Solution {
    public int StrToInt(String str) {
        char crr[] = str.toCharArray();
        int flag = 1;
        int sum = 0;
        int i = 0;
        if (crr.length == 0) {
            return 0;
        }
        if (crr[0] == '-' || crr[0] == '+') {
            if (crr[0] == '-') {
                flag = -1;
            }
            i++;
        }
        for (; i < crr.length; i++) {
            if (crr[i] >= '0' && crr[i] <= '9') {
                sum = sum * 10 + (crr[i] - '0');
            } else {
                return 0;
            }
        }
        return sum * flag;
    }
}

发表于 2023-04-23 08:42:35 回复(0)
public class Solution {
    public int StrToInt(String str) {
        char[] s = str.toCharArray();
        if (str.length() == 0 || str == null) return 0;
        int flag = 1;
        if (s[0] == '-') flag = -1;
        if (s[0] == '+' || s[0] == '-' ) s[0] = '0';
        int sum = 0;
        for (int i = 0; i < s.length; i++) {
            if (!(s[i] >= '0' && s[i] <= '9')) return 0;
            else {
                sum = sum * 10 + (s[i] - '0');
            }
        }
        return sum * flag;
    }
}

发表于 2023-03-10 17:10:05 回复(0)
public class Solution {
    public int StrToInt(String str) {
        char[] chs = str.toCharArray();
        if(chs == null || chs.length == 0) {
            return 0;
        }
        int flag = 1;
        int sum = 0;
        if(chs[0] == '+') {
            flag = 1;
            chs[0] = '0';
        } else if(chs[0] == '-') {
            flag = -1;
            chs[0] = '0';
        }
        for (int i = 0; i < chs.length; i++) {
            if(chs[i] < '0' || chs[i] > '9') {
                sum = 0;
                break;
            }
            sum = sum * 10 + chs[i] - '0';
        }
        return flag*sum;
    }
}
发表于 2022-04-01 21:27:29 回复(0)
public class Solution {
    public int StrToInt(String str) {
        if(str == null || str.length() == 0){
            return 0;
        }
        int a = 1;
        char[] ch = str.toCharArray();
        if(ch[0] == '-'){
             a = -1;
            ch[0] = '0';
        }
        if(ch[0] == '+'){
            a = 1;
            ch[0] = '0';
        }
        int sum = 0;
        for(int i = 0;i < ch.length;i++){
            if(!Character.isDigit(ch[i])){
                sum = 0;
                break;
            }
            sum = sum *10 + ch[i] -'0';
        }
        return sum * a;
    }
}

发表于 2022-03-26 18:09:39 回复(0)
该题最主要是判溢的难点,java可以把异常抛出去,再异常里面处理。
public class Solution {
    public int StrToInt(String str) {

        try {
            if(str ==null || str.length() ==0){
                return 0;
            }
            if(str.length() ==1 ){
                if(!isdigit(str.charAt(0))){
                    return 0;
                }
                return str.charAt(0) - ('0');
            }
            //肯定长度大于1
            if(str.charAt(0)!='+' && str.charAt(0) !='-' && !isdigit(str.charAt(0))){
                return 0;
            }
            boolean[] flag= new boolean[]{false,false};//false,false代表是负数
            if(str.charAt(0)=='+' || isdigit(str.charAt(0))){
                //是正数
                if(str.charAt(0)=='+'){
                    //第一位是+号
                    flag[0] = true;
                    flag[1] = true;
                }
                if(isdigit(str.charAt(0))){
                    flag[0] = true;
                    flag[1] = false; //第一位是数字
                }
            }
            //肯定第一位是符合标准的
            for (int i = 1; i < str.length(); i++) {
                if(!isdigit(str.charAt(i))){
                    return 0;
                }
            }
            //每一位都是符合标准的
            char[] chars = str.toCharArray();
            if(flag[0] & flag[1]){
                //如果第一位是+号
                int ret = 0;
                for (int i = 1; i < chars.length; i++) {
                    ret = ret* 10 + chars[i] - '0';
                }
                return ret;
            }
            else if(flag[0] & !flag[1]){
                //如果第一位是数字
                int ret = 0;
                for (int i = 0; i < chars.length; i++) {
                    ret = ret * 10 + chars[i] - '0';
                }
                return ret;
            }
            else{
                //第一位是负数
                int ret = 0;
                for (int i = 1; i < chars.length; i++) {
                    ret = ret* 10 + chars[i] - '0';
                }
                return -ret;
            }
        } catch (NumberFormatException e) {
            return 0;
        }

    }
    public boolean isdigit(char number){
        if( number >= '0' && number <= '9'){
            return true;
        }
        else{
            return false;
        }
    }

}


发表于 2021-10-30 23:35:50 回复(0)
import java.util.*;
public class Solution {
    public int StrToInt(String str) {
        StringBuilder s = new StringBuilder(str);
        if(s.length()==0)   return 0;
        int sym = 1;
        if(s.charAt(0) == '-'){
            sym = -1;
            s.deleteCharAt(0);
        }
        else if(s.charAt(0) == '+'){
             sym = 1;
             s.deleteCharAt(0);
        }
        int sum = 0;
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i) < '0' || s.charAt(i) > '9'){
                sum = 0;
                break;
            }
            else{
                sum = sum * 10 + (s.charAt(i) - '0');
            }
        }
        return sym * sum;
    }
}

发表于 2021-09-28 01:49:47 回复(0)
import java.util.*;

public class Solution {
    public int StrToInt(String str) {
        
        int flag = 1;
        
        int sum = 0;
        
        char[] strArr = str.toCharArray();
        
        for(int i = 0 ; i < strArr.length ; i++){
            if(strArr[i] >= 48 && strArr[i] <=57){
                sum += (strArr[i]-48)*Math.pow(10,strArr.length - i - 1);
            }else{
                if(i == 0){
                    if(strArr[i] == '-'){
                        flag *= -1;
                    }else if(strArr[i] == '+'){
                        continue;
                    }else{
                        return 0;
                    }
                }else{
                    return 0;
                }
            }
        }
        
        return sum*flag;
    }
}

发表于 2021-08-19 11:28:13 回复(0)
//我觉得Leetcode上的题目用例更加严谨一些
class Solution {
    public int myAtoi(String s) {
        s=s.trim();
        if(s.length()==0) return 0;
        int flag=1;
        int id=0;
        if(s.charAt(0)=='+'){
            id++;
            flag=1;
        }else if(s.charAt(0)=='-'){
            id++;
            flag=-1;
        }else{
            flag=1;
        }
        long sum=0;
        while(id<s.length()){
            if(!Character.isDigit(s.charAt(id)))  break;
            int n=s.charAt(id)-'0';
            if(sum>Integer.MAX_VALUE || (sum>=Integer.MAX_VALUE/10 && n>Integer.MAX_VALUE%10)){
                return flag==1? Integer.MAX_VALUE:Integer.MIN_VALUE;
            }else{
                sum=sum*10+n;
                id++;
            }
        }
        if(flag*sum>Integer.MAX_VALUE){
            return Integer.MAX_VALUE;
        }else if(flag*sum<Integer.MIN_VALUE){
            return Integer.MIN_VALUE;
        }else{
            return flag*(int)sum;
        }
    }
}

发表于 2021-08-17 21:25:13 回复(0)
public class Solution {
    public int StrToInt(String str) {
        if(str == null || str.length() == 0) {
            return 0;
        }
        String s = str.trim();
        char[] chs = s.toCharArray();
        if(chs.length == 1) {
            if(!Character.isDigit(chs[0])) {
                return 0;
            } else {
                return chs[0] - '0';
            }
        }
        // 第一个字符不是加减号,也不是数字
        if(chs[0] != '+' && chs[0] != '-' && !Character.isDigit(chs[0])) {
            return 0;
        }
        int ans = 0, index = 0;
        boolean isNegative = false;
        if(chs[0] == '-') {
            isNegative = true;
            index++;
        } else if(chs[0] == '+') {
            isNegative = false;
            index++;
        } else {
            index = 0;
        }
        for(int i = index; i < chs.length; i++) {
            if(!Character.isDigit(chs[i])) {
                return 0;
            }
            ans = ans*10 + (chs[i] - '0');
        }
        if(isNegative) {
            ans = -ans;
        }
        return ans;
    }
}

发表于 2021-08-13 15:38:29 回复(0)
import java.util.HashMap;

public class JZ49 {

    public static void main(String[] args) {
        JZ49 jz49 = new JZ49();

        System.out.println(jz49.StrToInt("2147483647"));
        System.out.println(jz49.StrToInt("-2147483648"));
        System.out.println(jz49.StrToInt("-2147483649"));
    }

    private HashMap<Character, Integer> map = new HashMap<>(){
        {
            put('0', 0);
            put('1', 1);
            put('2', 2);
            put('3', 3);
            put('4', 4);
            put('5', 5);
            put('6', 6);
            put('7', 7);
            put('8', 8);
            put('9', 9);
        }
    };
    
    public int StrToInt(String str) {
        if (str == null || str.isEmpty()) {
            return 0;
        }
        char firstChar = str.charAt(0);
        int index = 0;

        //默认是正号
        int limit = -Integer.MAX_VALUE;
        boolean flag = true;

        //第一位不是数字
        if (!map.containsKey(firstChar)) {
            //只有单独一个符号,非法
            if (str.length() == 1) {
                return 0;
            }
            index++;
            //第一位是负号
            if (firstChar == '-') {
                flag = false;
                limit = Integer.MIN_VALUE;
            }
            //第一位非法符号
            else if (firstChar != '+'){
                return 0;
            }
        }

        int result = 0;
        for (;index < str.length(); index++) {
            //正常数字
            if (map.containsKey(str.charAt(index))) {
                int digit = map.get(str.charAt(index));
                result = result * 10;
                int r = limit + digit;
                //溢出判断
                if (result < limit + digit) {
                    return 0;
                }
                result = result - digit;
            //非法字符
            } else {
                return 0;
            }
        }
        return flag ? -result : result;
    }
}

发表于 2021-07-21 10:37:24 回复(0)
java 9ms
public class Solution {
    public int StrToInt(String str) {
        int f =0;
        int i =0;
        int zf=1;
        if(str ==null || str.equals(""))
            return 0;
        if(str.charAt(0)=='-')
        {
            i=1;
            zf=0;
        }
        if(str.charAt(0)=='+')
            i=1;
        for(i=i;i<str.length();i++)
        {
            int c =str.charAt(i);
            if(c>='0' && c<='9')
            {
                f=f*10+c-'0';
            }
            else
                return 0;
        }
        return zf==1?f:-f;
    }
}


发表于 2021-05-14 17:10:16 回复(0)
测试用例不大行啊,能通过的代码但其实"-912345621232"都会出错,把溢出部分改了,原溢出处理:
//走到这里,说明是有效字符,且不是正负号
            //超过2147483647
            if(!flag && res * 10 >= 2147483640 && ch[i] >= '8'){
                return Integer.MAX_VALUE;
            }
            //小于-2147483648
            if(flag && res * 10 >= 2147483640 && ch[i] >= '9'){
                return Integer.MIN_VALUE;
            }
修改后的代码:
public int StrToInt(String str) {
        int res = 0;
        char[] ch = str.toCharArray();
        boolean flag = false;//flag为true表示负数
        for(int i = 0; i < ch.length; i++){
            //存在不合法字符,直接返回0
            if(!(ch[i] >= '0' && ch[i] <= '9') && ch[i] != '-' && ch[i] != '+') return 0;
            
            if(i == 0 && ch[i] == '-'){
                flag = true;
                continue;
            }else if(i == 0 && ch[i] == '+'){
                continue;
            }
            
            //走到这里,说明是有效数字
            //超过2147483647:如果res > 214748364, 则res至少为214748365,res*10必然>2147483647
            //如果卡边界,res * 10 = 2147483640,则ch[i]为0~7时合法
            if(!flag && ((res > 214748364) || (res  == 214748364 && ch[i] >= '7'))){
                return Integer.MAX_VALUE;
            }
            //小于-2147483648
            if(flag && ((res > 214748364) || (res  == 214748364 && ch[i] >= '8'))){
                return Integer.MIN_VALUE;
            }
            
            res = res * 10 + ch[i] - '0';
        }
            
        return flag ? -res : res;
    }


发表于 2021-05-03 15:25:31 回复(0)
public int StrToInt(String str) {
        boolean matches = str.matches("[+-]?\\d+");
        if (!matches) {
            return 0;
        } else {
            int temp = 1;
            int index = str.length()-1;
            int result = 0;

            if (str.matches("\\d+")){
                while (index >= 0) {
                    result += (str.charAt(index--) - 48) * temp;
                    temp*=10;
                }
            } else {
                while (index > 0) {
                    result += (str.charAt(index--) - 48) * temp;
                    temp*=10;
                }
                if (str.charAt(index) == '-') {
                    result = -result;
                }
            }


            return result;
        }
    }
编辑于 2021-05-02 15:35:26 回复(2)
public class Solution {
    public int StrToInt(String str) {
        
        if(str.isEmpty()){
            return 0;
        }
        
        int res=0;
        
        int len = str.length()-1;
        int x=1;
        
        while(len>=0){
            if(str.charAt(len)=='-'){
                res = -res;
            }else if(str.charAt(len)=='+'){
                
            }else if(str.charAt(len)<='9' && str.charAt(len)>='0'){
                res = res + (str.charAt(len)-'0')*x;
                x=x*10;
            }else{
                res=0;
                break;
            }
            
            len --;
            
        }
        
        return res;
        
        
        
        
    }
}

发表于 2021-03-31 16:50:40 回复(0)
public class Solution {
    public int StrToInt(String str) {
        if(str.length() == 0) return 0;//空值
        int index = 0;
        int res = 0;
        int sign = 1;//记录符号
        char[] arr = str.toCharArray();//图方便
        //首位可以是 + - 0~9
        if(arr[0] == '-'){
            sign = -1;
            index++;
        }
        else if(arr[0] == '+'){
            index++;
        }
        //非法字符
        else if(arr[0] > '9' || arr[0] < '0'){
            return 0;
        }
        //逐位遍历
        while(index < arr.length){
            if(arr[index] > '9' || arr[index] < '0') return 0;
            //合法字符
            res = (res == 0)? arr[index] - '0' : res*10 + arr[index] - '0';
            index++;
            System.out.println(res);
        }
        return sign*res;
    }
}
印象中lc是要判断溢出的,提交后发现这里不用,就算了
发表于 2021-02-23 21:53:26 回复(0)
 public int StrToInt(String str) {
        if(str==null || str.length()==0) return 0;
        long result =0;// 用long不用考虑数组越界
        boolean flag = true;// 结果为正数
        if(str.startsWith("-")){
            flag = false;
            str = str.substring(1,str.length());
        }else if(str.startsWith("+")){
            str = str.substring(1,str.length());
        }
        for(int i=str.length()-1;i>=0;i--){
            if(str.charAt(i)<='9'&&str.charAt(i)>='0'){
                result +=Math.pow(10,str.length()-i-1)*( str.charAt(i)-'0');
            }else{
                result=0;
                break;
            }
        }
        if(!flag) result = -result;
        return (int) result;// 结果强转为int
    }
1. 先把符号位去除,先同意按照正数处理。
2. 处理的过程中用long型数据来计算中间结果,遇到不是0-9的字符退出
3. 最后把结果强转为int

发表于 2021-02-15 11:35:55 回复(0)
这个代码是下面一位大佬的,但是大佬的注解不全,我没看太懂,直到我自己把注解写的详细一些才明白,我就把我写的注解也放上来,方便大家看明白。代入值建议可以试着用最大的正整数(2147483647)带入。

        //这个方法可以判断溢出,即数字大于2147483647时,输出0;
    //或者数字小于-2147483648时,输出0;
    public int StrToInt(String str) {
        if (str == null)
            return 0;
        int result = 0;
        boolean negative = false;//是否负数
        int i = 0, len = str.length();
        /**
         * limit 默认初始化为 负的 最大正整数 ,假如字符串表示的是正数
         * 那么result(在返回之前一直是负数形式)就必须和这个最大正数的负数来比较,
         * 判断是否溢出
         * 注意,int最大值为:2147483647    int最小值为:-2147483648
         * 超过该范畴,即为溢出,那么就返回0。
         */
        int limit = -Integer.MAX_VALUE; //limit = -2147483647  最小的INT型负数是-2147483648,因此无溢出,可以用int表示。
        int multmin;
        int digit;

        if (len > 0) {
            char firstChar = str.charAt(0);//首先看第一位
            if (firstChar < '0') { // Possible leading "+"&nbs***bsp;"-"
                if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;//在负号的情况下,判断溢出的值就变成了整数的 最小负数了
                } else if (firstChar != '+')//第一位不是数字和-只能是+
                    return 0;
                if (len == 1) // Cannot have lone "+"&nbs***bsp;"-"
                    return 0;
                i++;
            }
            //limit要么等于-Integer.MAX_VALUE=-2147483647,要么等于Integer.MIN_VALUE=-2147483648。
            multmin = limit / 10; //如果结果值是正数,此时multmin为:-214748364;如果是负数,此时multmin为:-214748364。两者相同
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = str.charAt(i++)-'0';//char转int
                if (digit < 0 || digit > 9)//0到9以外的数字
                    return 0;
                //判断溢出
                if (result < multmin) {   //假设现在i到了最后一位,i=len-1,假设此时result正好是-214748364
                    return 0;             //如果小于-214748364,即-214748365,-214748366,-2147483657,-2147483658,-2147483659。                     //说明待会儿肯定小于-2147483648,肯定溢出,则输出0。注意:这时候最后一位还没加入,接下来开始加入.....
                }
                result *= 10;//此时  result = -2147483640
                if (result < limit + digit) { //这里相当于  result-digit < limit,判断溢出;为了避免数字溢出导致代码无法执行,因此这样表达
                    return 0; //溢出
                }
                result -= digit; //经过上面一个if语句的判断,发现不会溢出,那么就将最后一位加入至result
            }
        } else {
            return 0;
        }
        //如果是正数就返回-result(result一直是负数)
        return negative ? result : -result;
    }


编辑于 2021-01-09 15:20:16 回复(0)