题解 | #把字符串转换成整数(atoi)#

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

http://www.nowcoder.com/practice/d11471c3bf2d40f38b66bb12785df47f

题意:
        



方法一:
模拟

思路:

        直接模拟。
        用 flag 判断正负,x 计算数的绝对值。
        最后判断边界:是否大于正数的最大值 or 小于负数的最小值。



class Solution {
public:
    
    int StrToInt(string s) {
        int len=s.size();
        long long x=0;
        int flag=0;//0表示正数,1表示负数
        int f=0;
        int num=0;
        for(int i=0;i<len;i++){
            if(f==0&&s[i]=='+'){//正号
                flag=0;
                num++;
            }else if(f==0&&s[i]=='-'){//负号
                flag=1;
                num++;
            }else if(f==0&&s[i]==' '){//空格
                continue;
            }else if(isdigit(s[i])){//数字
                if(num>1)
                    return 0;
                x=x*10+(s[i]-'0');
                f=1;
                if(x>(1ll<<31))
                    break;
            }else{
                break;
            }
        }
//         cout << flag << endl;
        if(flag==0&&x>(1ll<<31)-1){//大于正数的最大值
            return (1ll<<31)-1;
        }
        if(flag==1&&x>(1ll<<31)){//小于负数的最小值
            return 0-(1ll<<31);
        }
        if(flag==1)//负数
            return 0-x;
        return x;//正数
    }
};


时间复杂度:
空间复杂度:


方法二:
java实现

思路:
           思路参照方法一。
            直接模拟。
            但要注意 java long类型是8个字节,而且还要强制类型转换。 

import java.util.*;


public class Solution {
    
    public int StrToInt (String s) {
        int len=s.length();
        long x=0;
        int flag=0;//0表示正数,1表示负数
        int f=0;
        int num=0;
        for(int i=0;i<len;i++){
            if(f==0&&s.charAt(i)=='+'){//正号
                flag=0;
                num++;
            }else if(f==0&&s.charAt(i)=='-'){//负号
                flag=1;
                num++;
            }else if(f==0&&s.charAt(i)==' '){//空格
                continue;
            }else if(s.charAt(i)>='0'&&s.charAt(i)<='9'){//数字
                if(num>1)
                    return 0;
                x=x*10+(s.charAt(i)-'0');
                f=1;
                if(x>(1l<<31))
                    break;
            }else{
                break;
            }
        }
//         cout << flag << endl;
        if(flag==0&&x>(1l<<31)-1){//大于正数的最大值
            return (int)((1l<<31)-1);
        }
        if(flag==1&&x>(1l<<31)){//小于负数的最小值
            return (int)(0-(1l<<31));
        }
        if(flag==1)//负数
            return (int)(0-x);
        return (int)x;//正数
    }
}


时间复杂度:
空间复杂度:








全部评论

相关推荐

03-04 19:02
云南大学 Java
Yki_:没挂,只是没人捞,该干啥干啥,等着就好了
点赞 评论 收藏
分享
运营3年修炼中接简历辅导:你的科研项目经历里,只写了你的动作,没有写你的思考和成果,不要只写使用什么进行了什么,这等于罗列你的任务,简历是为了突出你的优秀,你在什么样的任务背景下,克服了什么样的困难,针对性地做了哪些事情,最后达成了什么成果(用数据体现你的成果和效率)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务