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

描述
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:
1.若干空格
2.(可选)一个符号字符(‘+’ 或 ‘-’)
3. 数字,字母,符号,空格组成的字符串表达式
4. 若干空格

转换算法如下:
1.去掉无用的前导空格
2.第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
3.判断整数的有效部分:
3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
3.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
3.3 整数超过 32 位有符号整数范围 [−2 ^31, 2 ^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2 ^31的整数应该被调整为 -2 ^31,大于 2 ^31 − 1 的整数应该被调整为 2 ^31− 1
4.去掉无用的后导空格

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

示例1
输入:"82"
返回值:82

示例2
输入:"   -12  "
返回值:-12
说明:
去掉前后的空格,为-12  

示例3
输入:"4396 clearlove"
返回值:4396
说明:
6后面的字符不属于有效的整数部分,去除,但是返回前面提取的有效部分  

示例4
输入:"clearlove 4396"
返回值:0

示例5
输入:"-987654321111"
返回值:-2147483648

思路:最普通的字符串遍历法。首先去除空格,然后遍历每个值,这里的难点就是端点值的问题,先判断,然后利用上一轮的值与端点少一位数值的值进行比较,并与上当前值的大小判断,从而得到是否大于端点值;

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return int整型
     */
    public int StrToInt (String s) {
        // write code here
        int result = 0;
        int unsignedFlag = 1; // 符号
        boolean flag = true;
        for (int i =  0; i < s.length(); i++) {
            if (s.charAt(i) == ' ' && flag) continue;
            else {
                if (flag) {                  // 第一个字符,为符号
                    flag = false;
                    if (s.charAt(i) == '-')                        {
                        unsignedFlag = -unsignedFlag;
                        continue;
                    }else if(s.charAt(i)=='+') continue;

                }                // 第一个字符
                if (s.charAt(i) >= '0' && s.charAt(i) <= '9' ) {
                    if ((unsignedFlag * result ==( Integer.MAX_VALUE)/10 && (s.charAt(i)-'0')>Integer.MAX_VALUE%10) || (unsignedFlag * result >( Math.pow(2,
                                                         31) - 1)/10 ))return Integer.MAX_VALUE;
                    else if ((unsignedFlag * result == Math.pow(-2,
                             31)/10 && (s.charAt(i)-'0')>-(Integer.MIN_VALUE%10))  || (unsignedFlag * result< Math.pow(-2,
                             31)/10)) return Integer.MIN_VALUE;
                    
                    result = result*10 + (s.charAt(i) - '0');
                } else break;
            }
        }
        return unsignedFlag * result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值