把字符串转换成整数

描述
写一个函数 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.去掉无用的后导空格
把字符串转换成整数(atoi)

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

难点是处理越界的字符:

package test2;

public class StrToIntTest2 {
    public static void main(String[] args) {
        StrToIntTest2 s = new StrToIntTest2();
        int i = s.StrToInt(
                "13333744073709551617");
        System.out.println(i);
    }
    public int StrToInt (String s) {
        //判断空
        if(s.length()==0) return 0;
        int index=0;//记录下标的一个指针
        //去掉前导空格
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i)==' '){
                index++;//后移
            }else{
                break;
            }
        }
        System.out.println("index:"+index);
        //越过前导空格后什么也没有了
        if(index == s.length()) return 0;
        //判断正负号
        int flag=1;
        if(s.charAt(index)=='-'){
            flag=-1;//变负数
            index++;
        }else if(s.charAt(index)=='+'){//变正数
            index++;
        }
        long res=0;//存最终结果的
        for (int i = index; i < s.length(); i++) {
            if(s.charAt(i)>='0' &&  s.charAt(i)<='9'){
                res= res*10 + (s.charAt(i)-'0');
                //System.out.println("res="+res);
                // 半路已经溢出了,所以要半路处理,放在循环中
                //处理越界的数,分正负数,如果把以下代码放在循环外
                //则正数的直接会溢出变成负数,数据就错了
                if(flag>0 && res>Integer.MAX_VALUE){
                    return Integer.MAX_VALUE;
                }
                if(flag<0 && res*(-1)<Integer.MIN_VALUE){
                    return Integer.MIN_VALUE;
                }
            }else{
                break;
            }
        }
        return (int)(flag*res) ;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值