8. 字符串转换整数 (atoi)

解题思路(简单粗暴好理解的解法):

1.遍历字符串,找到第一个非空格的字符,如果没找到,就返回0

2.如果找到的第一个非空字符为正或者负号,则要考虑符号位后一位是否是数字(通过flag判断),不是数字则返回0

3.如果符号位后一位是数字,就要将接下来的连续数字转化为整数,为了防止累加的过程中越界,这里做了两个处理:一是将累加结果res定义成long,二是边加边判断当前结果是否超范围

4.如果找到的第一个非空字符为数字,同样执行累加的过程,具体过程与第3步类似

5.如果找到的第一个非空字符不是数字,直接返回0

代码实现:

class Solution {
    public int myAtoi(String str) {
        //1.寻找到第一个非空格的字符
        //2.当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来
        //3.忽略字符串除了有效的整数部分之外的多余的字符
        //4.若函数不能进行有效的转换时,返回 0
        int len=str.length();
        int i=0;
        long res=0;
        while(i<len){
            //1.寻找到第一个非空格的字符
            while(i<len&&str.charAt(i)==' '){
                i++;
            }
            if(i==len){//没找到第一个非空格的字符
                return 0;
            }
            //2.找到的第一个非空字符为正或者负号
            char first=str.charAt(i);
            boolean flag=false;//符号位后有数字
            if(first=='+'||first=='-'){
                i++;
                while(i<len&&str.charAt(i)>='0'&&
                str.charAt(i)<='9'){//数字
                    flag=true;
                    int temp=str.charAt(i)-'0';
                    res=res*10+temp;
                    if(res>Integer.MAX_VALUE&&first=='+'){
                        return Integer.MAX_VALUE;
                    }
                    else if(res>Integer.MAX_VALUE&&first=='-'){
                        return Integer.MIN_VALUE;
                    }
                    i++;
                }
                if(flag){
                    res=(first=='-'?(-res):res);
                }
                break;
            }
            //3.找到的第一个非空字符为数字
            else if(first>='0'&&first<='9'){
                while(i<len&&str.charAt(i)>='0'&&
                str.charAt(i)<='9'){//数字
                    int temp=str.charAt(i)-'0';
                    res=res*10+temp;
                    if(res>Integer.MAX_VALUE){
                        return Integer.MAX_VALUE;
                    }
                    i++;
                }
                break;
            }
            //4.找到的第一个非空字符不是数字
            else{
                return 0;
            }
        }
        return (int)res;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值