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

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

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

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    public int StrToInt (String s) {
        // write code here
        
        // 这道题,我算是明白了,你每进行一次切分之后,就判断是否为空串,不然老是报越界的问题
        
        // 去掉无用的前导空格和无用的后导空格(如果有)
        s = s.trim();
        
        // 一些特殊情况的处理
        // ""    " "
        if ("".equals(s)) {
            return 0;
        }
        
        // 取出第一个字符
        char chr = s.charAt(0);
        // 如果第一个非空字符不是如下三种字符之一,那么直接返回 0
        if (!(chr == '+' || chr == '-' || (chr >= '0' && chr <= '9'))) {
            return 0;
        }
        
        int sign = 1; // 定义一个整型变量,用于存放符号位。1:正数    -1:负数
        if (chr == '-') { // 除非是负数,否则符号位不需要改变(默认是正数)
            sign = -1;
        }
        
        String tmpStr = null; // 定义一个 String 类型的变量,用于获取整数的有效部分
        // 截取符号位(如果有)
        if (chr == '+' || chr == '-') {
            tmpStr = s.substring(1);
        }
        else {
            tmpStr = s;
        }
        
        // "+"    "-"
        if ("".equals(tmpStr)) {
            return 0;
        }
        
        int index = tmpStr.length(); // 截取的位置
        for (int i = 0; i < tmpStr.length(); i++) {
            if (tmpStr.charAt(i) < '0' || tmpStr.charAt(i) > '9') {
                index = i;
                break;
            }
        }
        tmpStr = tmpStr.substring(0, index); // 截取有效的整数部分
        
        // "+-5"
        if ("".equals(tmpStr)) {
            return 0;
        }
        
        // 把 tmpStr 前面的 0,全部切分出去
        index = 0;
        for (int i = 0; i < tmpStr.length(); i++) {
            if (tmpStr.charAt(i) != '0') {
                break;
            }
            index++;
        }
        tmpStr = tmpStr.substring(index);
        
        if ("".equals(tmpStr)) {
            return 0;
        }
        
        // 这里要限制一下 tmpStr 的长度。如果 tmpStr 的长度长到 long 类型都装不下,直接返回
        if (tmpStr.length() > "2147483647".length()) {
            if (sign == -1) {
                return (int)(-Math.pow(2, 31));
            }
            else {
                return (int)(Math.pow(2, 31) - 1);
            }
        }
        
        long tmpValue = Long.valueOf(tmpStr);
        tmpValue = tmpValue * sign; // 别忘了乘上符号位!!!
        
        // 定义一个整型变量,用于存放最终的返回结果
        int rs = 0;
        // 如果整数超过了 int 类型的范围,就要进行截取
        if (tmpValue > Math.pow(2, 31) - 1) {
            rs = (int)(Math.pow(2, 31) - 1);
        }
        else if (tmpValue < -Math.pow(2, 31)) {
            rs = (int)(-Math.pow(2, 31));
        }
        else {
            rs = (int)tmpValue;
        }
        return rs;
    }
}
全部评论

相关推荐

找不到工作死了算了:没事的,雨英,hr肯主动告知结果已经超越大部分hr了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务