20210331力扣第八题:字符串转换整数(JAVA)

1.自己当时的思想

开始看到这道题的时候写了个大概,当时自己的思想:
先转化成数组,再遍历字符数组,把数字全部取出来,在判断最终是否大于MAX_VALUE或者小于MIN_VALUE就可以了,但是呢,在测试代码阶段感觉还可以就提交了,但是发现提交时候的样本测试不能通过,就开始了在源代码上维修自己的漏洞,这个测试没通过,价格if语句,又来一个测试样列,再加一个if,但是最终在测试样例‘-+12’和‘±12’之间,我加了几次if,发现不能解决这些小问题了。自此放弃了原来的思想,并且这时候代码变得十分冗余。

2.学习别人的思想;

力扣官方的解题思路我看了一下,我在结题评论中 选择了一个和自己思想比较符合的例子来玩成了这道题。由于测试案例中的‘-+’和‘±’,查看别人的代码后:

捋一下别人的思路:
2.1 设置初始的状态state=0;
当初始状态为0且遇到‘+’时,将state变为1
当初始状态为0遇到‘-’时,将state变为2
2.2 开始获取字符数组中的数组部分
用char[i]>=‘0’ 和char[i]<='9’判断
进图判断之后 将state设置为正数 1;
此时人家的代码 是每次得到一个数字,是在原来的基础上乘以10+这个数字(如 ls = ls*10+ 这个数),这样得到的也比较新颖(不像自己之前用的是stringbuilder来做的)
2.3 最后得到的数字判断他们的状态和max min大小即可完成;

3 代码

class Solution {
    public int myAtoi(String s) 
    {
        long ls = 0;
        int state = 0;//设置状态 1位正 2位负
        char[] cs = s.toCharArray();//转换为 字符数组 好遍历
        for(int i =0 ;i<cs.length;i++){
            if(state==0&&cs[i]==' ') continue;//空格 越过
            else if(state==0&&cs[i]=='+' ) state = 1;//正数 改变 状态
              else if(state==0&&cs[i]=='-') state =2;//负数改变状态
                else if(cs[i]>='0'&&cs[i]<='9')//筛选 数字
                {
                    if(state==0) state=1;
                    int tem = Character.getNumericValue(cs[i]);
                    ls = ls*10+tem;
                    if(ls>Integer.MAX_VALUE) break;//当数字大于max时候 不用再管了  最后返回的就是max
                }
                else break;//不是数字的时候怎么办
        }
        //接下来这些步骤也很重要,我开始写的一遍时候 ,每次超出数组大小返回的却不是max,最后我又重新写了一遍
        if(state ==1 && ls>Integer.MAX_VALUE)  ls = Integer.MAX_VALUE;
        else if(state ==2 )
        {
            ls=-ls;
            if(ls<Integer.MIN_VALUE) ls=Integer.MIN_VALUE;
        }
        return (int)ls;

    }
}

4 小结

其中状态的设置很重要哦
当已经遍历完字符数组之后,就是对ls的判断,看他状态和max min 的值
当状态是1的时候 就看和max比较
当是2时候就要 取反,再看去和min大小,
最后返回的时候 再强转为INT

第一次写的时候 当超出INTEGER.MAX MIN大小范围时候返回了10…的一个很大的数,却没有返回max min ,所以在判断和max min大小也很重要。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值