力扣8 字符串转换整数

本题不难,只要想好条件判断就可以解出。

我自己做的时候没有注意仔细看题目要求,所以实现的时候出现了一些错误。之后遇到了数的上限值问题处理,在这里没想到如何进行处理。

class Solution {
    public int myAtoi(String s) {
        //字符串的长度
        int l = s.length();
        int res = 0;
        boolean fu = false;
//记录最小值、最大值用于判断
        int max = Integer.MAX_VALUE;
        int min = Integer.MIN_VALUE;
        //循环判断
        for(int i=0; i< l;i++){
            //获取当前遍历到的字符
            char c = s.charAt(i);
            //判断是否是负数
            if(c =='-'){
                fu = true;
            }
            //是数字,加入到运算,不是另外判断
            if('0' <= c && c <='9'){
                res = res*10 + (c -'0'); 
            }else if(c== ' '|| c == '-' || c=='+')
            {
                continue;
            }
            else{
                
                return res;
            }

            if(res >= max){
                return max;
            }
        }
//如果有负号,将结果值变为负的再返回
        if(fu){
            res = -res;
            if(res <min){
                return min;
            }
            else{return res;}
        }
        return res;
    }
}

我写的解题方法无法处理出现在数字之后的“+”“-”“ ”这些符号,按题意应该是直接结束。并且我这个写法是无法处理数的上限问题的。

 看了题解后知道了要处理上限问题就要提前先处理一下。res的计算公式为:res = res*10 +num;因为res对后来的数进行处理之后可能就会大过上限值了,这样就会导致越界问题,使得数据无法比较。

所以处理的方法就是比较上限值/10和res,如果res比上限/10还要大,那么再来一个数,res的值肯定会比上限值要大。这种情况下能判断出来。如果两者相等,就要判断要加入的数和上限的最后一位的大小。这样就能判断出来是否发生了越界。同理,最小值也是用这种方法进行判断。

对于数字后出现的"-","+"," "我写的有问题,无法判断,感觉可以通过设置几个标志来判定,但这样就过于繁琐了。在参考的题解中使用的方法是将字符串转换成字符数组,通过index来标记遍历到的位置。之后先判断完前面的" ",再判断"-","+"和字母的情况,之后遇到数字后再使用数字相关的计算方法。遇到非数字就直接终止。

class Solution {
    public int myAtoi(String s) {
        int len = s.length();
        char[] chars = s.toCharArray();
        int index =0;
        int res =0;
        int max =Integer.MAX_VALUE;
        int min = Integer.MIN_VALUE;
        //按照情况判断
        //判断开始时的空格
        while(index < len && chars[index] ==' '){
            index++;
        }
        //长度的判断
        if(index == len){
            return res;
        }
        //判断符号
        int sign =1;
        if(chars[index] == '+'){
            index++;
        }
        else if(chars[index] == '-'){
            index++;
            sign=-1;
        }
        //处理数字部分
        while(index <len){
            char temp = chars[index];
            if(temp >'9' || temp <'0'){
                break;
            }
            if(res > max/10 || (res == max/10 && (temp -'0') > max%10)){
                return max;
            }
            if(res < min/10 ||(res == min/10 && (temp - '0') > -(min%10))){
                return min;
            }
            //要将符号标记加入到计算,不能只在最后判读一次,不然无法返回超过下限的结果。
            res = res *10 +sign*(temp -'0');
            index++;
        }

        
        return res;
    }
}

 题解参考 : “ 尽量不使用库函数、一次遍历(Java) - 字符串转换整数 (atoi) - 力扣(LeetCode)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值