首页 > 试题广场 >

把字符串转换成整数(atoi)

[编程题]把字符串转换成整数(atoi)
  • 热度指数:59339 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:
1.若干空格
2.(可选)一个符号字符('+' 或 '-')
3. 数字,字母,符号,空格组成的字符串表达式
4. 若干空格

转换算法如下:
1.去掉无用的前导空格
2.第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
3.判断整数的有效部分:
3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
3.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
3.3  整数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231的整数应该被调整为 −231 ,大于 231 − 1 的整数应该被调整为 231 − 1
4.去掉无用的后导空格


数据范围:
1.0 <=字符串长度<= 100
2.字符串由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成


示例1

输入

"82"

输出

82
示例2

输入

"   -12  "

输出

-12

说明

去掉前后的空格,为-12  
示例3

输入

"4396 clearlove"

输出

4396

说明

6后面的字符不属于有效的整数部分,去除,但是返回前面提取的有效部分  
示例4

输入

"clearlove 4396"

输出

0
示例5

输入

"-987654321111"

输出

-2147483648
给大家尝尝我写的屎山代码
public class Solution {
    public int StrToInt(String s) {
        if (s.length()==0) return 0;
        char end = ' ';
        char positive = '+';
        char negative = '-';
        long number = 0;
        int index = 0;
        //先去掉空格
        while (index!=s.length()-1&&s.charAt(index) == end) {
            index++;
        }

        if (index!=s.length()-1&&s.charAt(index) == positive) {
            index++;
            while (index < s.length()&&s.charAt(index) >= '0' && s.charAt(index) <= '9' && s.charAt(index) != end) {
                number += s.charAt(index) - '0';
                number *= 10;
                index++;
            }
        } else if (index!=s.length()-1&&s.charAt(index) == negative) {
            index++;
            while (index < s.length()&&s.charAt(index) >= '0' && s.charAt(index) <= '9' && s.charAt(index) != end) {
                number -= s.charAt(index) - '0';
                number *= 10;
                index++;
            }
        } else if (index!=s.length()-1&&s.charAt(index) >= '0' && s.charAt(index) <= '9') {
            while (index < s.length()&&s.charAt(index) >= '0' && s.charAt(index) <= '9' && s.charAt(index) != end) {
                number += s.charAt(index) - '0';
                number *= 10;
                index++;
            }
        }

        if (number/10 > Integer.MAX_VALUE) {
            return Integer.MAX_VALUE;
        } else if (number/10 < Integer.MIN_VALUE) {
            return Integer.MIN_VALUE;
        }else {
            return (int)(number / 10);
        }
    }
}


编辑于 2024-01-22 15:13:14 回复(0)
载跟斗一次在首次为零的情况,忘记这种场景了。这种题目其实思路非常清楚,就是一步一步处理不要的数字,然后找到数字区域,取出来判断一下边界。鄙视那些用正则的,这个是写算法,不是来秀正则的。
发表于 2023-12-11 23:21:26 回复(0)
非Java可能无法使用:利用捕捉异常的方式,解决超出long最大值限制。
public int StrToInt (String s) {
        // write code here
        StringBuilder num = new StringBuilder();
        boolean sgn = false, flag = false, digit = false;
        s = s.trim();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if ( !digit && !sgn && (c == '-' || c == '+')) {
                sgn = true;
                if (c == '-') flag = true;
            } else if (Character.isDigit(c)) {
                digit = true;
                num.append(c);
            } else {
                break;
            }
        }
        if (num.length() == 0) return 0;
        int index = 0;
        while (index < num.length() - 1 && num.charAt(index) == '0') index++;
        // long res = flag ? -Long.parseLong(num.substring(index)) : Long.parseLong(
        //                num.substring(index));
        
        //如果没捕获异常问题出在这里:转后长度太长越界。
        //解决方式:直接捕捉异常后输出。
        long res ;
        try {
            res = flag ? -Long.parseLong(num.substring(index)) : Long.parseLong(
                      num.substring(index));
        } catch (Exception e) {
            return flag ? Integer.MIN_VALUE : Integer.MAX_VALUE;
        }
        if (res < Integer.MIN_VALUE) return Integer.MIN_VALUE;
        if (res > Integer.MAX_VALUE) return Integer.MAX_VALUE;
        return (int)res;
    }

发表于 2023-08-08 00:34:37 回复(0)
这种题我**感觉都挺难的,测试用例鼻屎太多,不好调,特别是对我这样的新手,贼**煎熬
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return int整型
     */
    public int StrToInt (String s) {
        // write code here
        //去掉前导空格
        String replaceStr = s.replaceAll("^ +","");
        Pattern pt = Pattern.compile("^[+-]{0,1}\\d+");
        Matcher matcher = pt.matcher(replaceStr);
        int result = 0;
        if(matcher.find()){
            //找到匹配的数组
            String numberStr = matcher.group();
            //正负号标记
            int symbolFlag = numberStr.charAt(0) == '-' ? -1:1;

            //去掉符号和前导0
            numberStr = numberStr.replaceAll("^[+-]+","");
            numberStr = numberStr.replaceAll("^0+","");
            long tempNumber = 0;

            if(numberStr.length() > 11){ //字符串是否过长,过长可以不用判断
                if(symbolFlag == 1){
                    result = Integer.MAX_VALUE;
                } else {
                    result = Integer.MIN_VALUE;
                }
            } else { //正常的字符串长度
                for(int i = numberStr.length()-1,j=0;i>=0;i--){

                    tempNumber = tempNumber + Integer.parseInt(numberStr.charAt(i) + "")* (int)Math.pow(10,j++);
                    if(symbolFlag == 1){ //正数
                        if(tempNumber > Integer.MAX_VALUE){
                            result = Integer.MAX_VALUE;
                            break;
                        }
                    }
                    if(symbolFlag == -1){ //负数
                        if((0-tempNumber) < Integer.MIN_VALUE){
                            result = Integer.MIN_VALUE;
                            break;
                        }
                    }
                   
                }

                if(result == 0 && numberStr.length() > 0){
                    result = Integer.parseInt((symbolFlag == 1?"+":"-") + numberStr);
                }  
            }
           

        }
       
        return result;

    }
}
编辑于 2023-07-23 17:47:31 回复(0)

啥话不说了, 暴力狂魔

import java.util.*;

public class Solution {

    /**

     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可

     *

     *

* @param  s string字符串

* @return int整型

     */

    public int StrToInt (String s) {

        String trim = s.trim();

        StringBuilder numberString = new StringBuilder();

        char[] chars = trim.toCharArray();

        boolean isFirst = true;

        for (char aChar : chars) {

            if (isFirst) {

                isFirst = false;

                if (aChar == '+' || aChar == '-') {

                    numberString.append(aChar);

                    continue;

                }

            }

            if (!(aChar >= '0' && aChar '9')) {

                break;

            }

            numberString.append(aChar);

        }

        if (numberString.length() == 0 || "+".contentEquals(numberString) ||

                "-".contentEquals(numberString)) {

            numberString.append("0");

        }

        long number;

        try {

            number = Long.parseLong(numberString.toString());

        } catch (NumberFormatException e) {

            number = numberString.charAt(0) == '-' ? Integer.MIN_VALUE : Integer.MAX_VALUE;

        }

        if (number > Integer.MAX_VALUE) {

            return Integer.MAX_VALUE;

        }

        if (number Integer.MIN_VALUE) {

            return Integer.MIN_VALUE;

        }

        return (int) number;

    }

}
发表于 2023-05-08 08:11:24 回复(0)
相对来说比较好懂
import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return int整型
     */
    public int StrToInt (String s) {
        // write code here
        s=s.trim();
        if(s.length()==0)return 0;
        char[] chars = s.toCharArray();
        int sign = 1;
        int start = 0;
        if(chars[0]=='-'){
            sign=-1;
            start=1;
        }else if(chars[0]=='+'){
            start=1;
        }else{
            start=0;
        }
        long value = 0;
        for(int i =start;i<chars.length;i++){
            if(chars[i]>'9' || chars[i]<'0'||value>Math.pow(2,31))break;
            value = value*10+(chars[i]-'0');
        }
        if(sign*value>Math.pow(2,31)-1)return (int)(Math.pow(2,31)-1);
        if(sign*value<Math.pow(-2,31))return (int)Math.pow(-2,31);
        return (int)value*sign;
    }
}
发表于 2023-03-24 12:37:28 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return int整型
     */
    public int StrToInt (String s) {
        // write code here

        String str = s.trim();
        int len = str.length(); //给定的字符串长度
        if (len == 0) return 0;
        int sign = 1;
        StringBuilder sb = new StringBuilder();
        char ch = str.charAt(0);
        if (ch == '-') {
            sign = -1;
        } else if (ch == '+') {
            sign = 1;
        } else if (ch < '0' || ch > '9') {
            return 0;
        } else {
            sb.append(ch);
        }

        for (int i = 1; i < str.length(); i++) {
            char ch0 = str.charAt(i);
            if (ch0 >= '0' && ch0 <= '9') {
                sb.append(str.charAt(i));
            } else {
                break;
            }
        }
        if (sb.length() == 0) return 0;
        System.out.println(sb.toString());
        String str0 = sb.toString();
        int num = 0;
        System.out.println(sign);
        for (int j = 0; j < str0.length() - 1; j++) {
            num = num * 10 + (str0.charAt(j) - '0');
            System.out.println(num);

            if (sign == -1) {
                if ( num + Integer.MIN_VALUE > - (num * 9 + str0.charAt(j + 1) - '0')) {
                    return Integer.MIN_VALUE;
                }
            } else {
                if (Integer.MAX_VALUE - num < (num * 9 + str0.charAt(j + 1) - '0')) {
                    return Integer.MAX_VALUE;
                }
            }
        }
        num = num * 10 + str0.charAt(str0.length() - 1) - '0';
        return sign * num;
    }
}

发表于 2023-01-08 14:07:41 回复(0)
import java.util.*;
public class Solution {
    public int StrToInt (String s) {
        // 先去掉空格
        s = s.trim();
        // 判断长度为0的情况
        if(s.length()==0)
            return 0;
        
        // 默认返回为正数,定义一会遍历字符串的起始位
        int sign=1;
        int start=0;
        // 取第一个特殊位为符号位
        if(s.charAt(0)=='-'){
            sign = -1;
            start = 1;
        }else if(s.charAt(0)=='+'){
            start = 1;
        }else{
            start = 0;
        }
        
        // 遍历字符串
        long value=0;
        for(int i=start;i<s.length();i++){
            // 当前符号不是数字,或者刚好比2的31次方-1大一轮的时候,break
            if(s.charAt(i)>'9' || s.charAt(i)<'0' || value>Math.pow(2,31)-1){
                break;
            }
            // 每轮往上累加
            value = value*10+(s.charAt(i)-'0');
        }
        
        // 如果比int边界大
        if(value * sign > Math.pow(2,31)-1){
            return (int)(Math.pow(2,31)-1);
        }
        // 如果比int边界小
        else if(value * sign < Math.pow(-2,31)){
            return (int)(Math.pow(-2,31));
        }
        // 否则直接返回即可
        else{
            return (int)value * sign;
        }
    }
}

发表于 2022-09-19 16:02:22 回复(0)
    public static int StrToInt (String s) {

        // write code here
        //1.判空
        if (s.isEmpty()) {
            return 0;
        }
        //2.去前导空格
        int index = 0;
        while (index < s.length()) {
            if (s.charAt(index) == ' ') {
                index++;
            } else {
                break;
            }
        }
        //2.1空格之后就结束了 啥都没有了
        if (index == s.length()) {
            return 0;
        }
        //3.处理带有的正负号
        int sign = 1;//用于改变数字的正负 默认为正数

        if (s.charAt(index) == '+') {
            index++;
        } else if (s.charAt(index) == '-') {
            index++;
            sign = -1;
        }

        //3.1正负号后面啥都没有了
        if (index == s.length()) {
            return 0;
        }
        //4.将剩下的字符转换成long类型的数字 在转换过程中判断是否越界 或者 判断出存在非法字符返回0
        long  ans = 0;//最终的结果 不带符号 用long是因为 在判过程中可能会超出int的范围
        while (index < s.length()) {
            //判断字符是否在0~9的范围内 不是则就是非法字符
            if (s.charAt(index) >= '0' && s.charAt(index) <= '9') {
                //判断是否超过了int的范围
                ans = ans * 10 + s.charAt(index) - '0';//更新ans 如数字是123 则第一次 ans = 0 * 10 + 1 第二次 ans = 1 * 10 + 2 ......
                //这里每遍历一次都对ans进行一个越界的判断
                if (sign == -1 && ans * sign < Integer.MIN_VALUE) {
                    return Integer.MIN_VALUE;
                } else if (ans * sign > Integer.MAX_VALUE) {
                    return Integer.MAX_VALUE;
                }
            } else {
                break;//因为ans本身就是0 相当于返回了结果为0
            }
            index++;
        }
        //5.没有超出int范围 直接返回ans * sign
        return (int) ans * sign;
    }

发表于 2022-09-07 19:01:35 回复(0)
这道题是不是有毛病?+0 1723,预期输出是 0 ,- 0032a12, 预期结果却是 -32。正负符号后面带0,还得分情况讨论,这有啥意义。
发表于 2022-08-24 11:15:18 回复(1)
import java.util.*;


public class Solution {
   
     
    public  int StrToInt (String s) {
        String str=s.trim();
        if("".equals(str)) return 0;
        boolean flag=true;  //正负标识
        boolean over=false;  //是否溢出标识
        int index=0;
        int sum=0;
        char ch=str.charAt(index);
        if(ch=='+'){
            flag=true;
            index++;
        }else if(ch=='-'){
            flag=false;
            index++;
        }else if(ch>='0'&&ch<='9'){
            sum=ch-48;  //'0'-48==0
            index++;
        }else{
            return 0;
        }
        while(index<str.length()&&str.charAt(index)>='0'&&str.charAt(index)<='9'){
            int num=str.charAt(index)-48;   //当前数字
            sum=sum*10+num;
            if(sum<0){
                over=true;  //出现溢出了,可以不用循环了
                if(flag){ //为正数
                    sum=Integer.MAX_VALUE;
                }else{  //为负数
                    sum=Integer.MIN_VALUE;
                }
                break;
            }
            //没有发生溢出,接着循环
            index++;
        }

        //循环结束,判断flag 和 over 标志
        if(over){ //如果溢出,直接返回
            return sum;
        }else{ //没有溢出,给数加上正负标志
            return flag==true?sum:sum*-1;
        }
     }
}
  //1.先对字符串进行去除前后空格操作
    //2.判断第一个字符,有四种可能:+,-,数字,其他,如果是+,或者-,就把符号标志位设置成true或者false,index++;如果是其他,直接返回0;
    //3.第一个字符不是其他的情况下:index往后走,如果index的字符不是数字,就结束返回结果
    //4.在没有结束,依然循环的情况下: sum=sum*10+num;  判断sum是否溢出int值,溢出就结束循环,返回结果
发表于 2022-08-16 16:59:07 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    public int StrToInt (String s) {
        // write code here
        s=s.trim();    //去掉前后空格
        if(s.equals("")) return 0;
        boolean flag=true;   //默认为正数
        boolean temF=false;
        int i=0;
        long num=0;
        if(s.charAt(0)!='-' && s.charAt(0)!='+' &&!isNum(s.charAt(0))) return 0;
        if(s.length()>1 && (s.charAt(0)=='-' || s.charAt(0)=='+') && !isNum(s.charAt(1)) ) return 0;
        while(i<s.length()){
            //System.out.println("我寄哪里了");
            if(!isNum(s.charAt(i))){
                if(temF) break;
                if(s.charAt(i)=='-') flag=false;
                i++;
                continue;
            }
            int temp=s.charAt(i)-'0';
            num=num*10+temp;
            temF=true;
            i++;
            if(num>(int)Math.pow(2,31)){
                num=(int)Math.pow(2,31);
                if(!flag) num++;
                break;
            }
        }
        return flag?(int)num:-(int)num;
    }
    
    public boolean isNum(char c){
        return c>='0' && c<='9';
    }
}

发表于 2022-08-09 10:53:39 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    public int StrToInt (String s) {
        // write code here
        s=s.trim();
        if(s.length()==0){
            return 0;
        }
        char first=s.charAt(0);
        int synmbol=1;
        if(first=='+'||(first>='0'&&first<='9')){
            synmbol=1;
        }else if(first=='-'){
            synmbol=-1;
        } else{
            return 0;
        }
        int index=0;    //下标
        if(first>='0'&&first<='9'){
            index=0;
        }else{
            index=1;
        }
        char[] arr=s.toCharArray();
        long res=0;
        for(;index<arr.length;index++){
            if(arr[index]>='0'&&arr[index]<='9'){
                if(res==0){
                    res=arr[index]-'0';
                }else{
                    res*=10;
                    res+=arr[index]-'0';
                }
                if(synmbol==1&&res>=Integer.MAX_VALUE){
                    return Integer.MAX_VALUE;
                }else if(synmbol==-1&&res*synmbol<=Integer.MIN_VALUE){
                    return Integer.MIN_VALUE;
                }
            }else{
                break;
            }
        }
        return (int)res*synmbol;  
        
    }
}
发表于 2022-08-01 18:32:09 回复(0)
    public int StrToInt (String s) {
        // write code here
        int index=0 ,len=s.length() ,maxVal=Integer.MAX_VALUE ,minVal=Integer.MIN_VALUE;
        StringBuilder res = new StringBuilder();
        String pre="" ,maxStr=String.valueOf(maxVal) ,minStr=String.valueOf(minVal);
        while(index<len && s.charAt(index)==' '){
            index++;
        }
        if(index<len && s.charAt(index)=='-'){
            pre="-";
            index++;
        }else if(index<len && s.charAt(index)=='+'){
            index++;
        }
        while(index<len){
            char c = s.charAt(index++);
            if(c==' '){
                if(res.length()==0){
                    continue;
                }else{
                    break;
                }
            }
            if(c>='0' && c<='9'){
                if(res.length()>0 && res.charAt(0)=='0' && res.charAt(res.length()-1)=='0'){
                    res.deleteCharAt(res.length()-1);
                }
                res.append(c);
            }else{
                break;
            }
        }
        if(res.length()==0){
            return 0;
        }
        String out=pre+res;
        if(pre.equals("") && compare(out ,maxStr)){
            return maxVal;
        }
        if(pre.equals("-") && compare(out ,minStr)){
            return minVal;
        }
        return out.equals("")?0:Integer.parseInt(out);
    }
    
    public boolean compare(String s1,String s2){
        if(s1.length()>s2.length()){
            return true;
        }else if(s1.length()<s2.length()){
            return false;
        }else{
            int len = s1.length() ,index=0;
            while(index<len){
                if(s2.charAt(index)>s1.charAt(index++)){
                    return false;
                }
            }
            return true;
        }
    }

发表于 2022-07-17 14:38:00 回复(0)
4396 clearlove???小编警告一次⚠,下次泰拳👊
发表于 2022-02-22 22:40:42 回复(0)
import java.util.*;


public class Solution {
    public int StrToInt (String s) {
        String[] strs = s.trim().split(" ");
        if(strs.length==0){
            return 0;
        }
        boolean flag = true;
        String str = strs[0].trim();
        if(str.length()==0){
            return 0;
        }
        if(str.charAt(0)=='-'){
            flag = false;
            str = str.substring(1);
        } else if(str.charAt(0)=='+'){
            str = str.substring(1);
        }
        int cur = 0;
        long ret = 0;
        while(cur < str.length()){
            char c = str.charAt(cur++);
            if(c<'0' || c>'9'){
                return getResult(ret,flag);
            }
            ret = ret*10 + c-'0';
            if(flag && ret > Integer.MAX_VALUE){
                return Integer.MAX_VALUE;
            }
            if(!flag && ret-1 > Integer.MAX_VALUE){
                return Integer.MIN_VALUE;
            }
        }
        return getResult(ret,flag);
    }
    private int getResult(long ret,boolean flag){
        if(flag){
            return ret>Integer.MAX_VALUE?Integer.MAX_VALUE:(int)ret;
        } else {
            return ret-1>Integer.MAX_VALUE?Integer.MIN_VALUE:(int)-ret;
        }
    }
}

发表于 2022-02-20 16:25:12 回复(0)

问题信息

上传者:牛客301499号
难度:
32条回答 3260浏览

热门推荐

通过挑战的用户