剑指offer—把字符串转换为整数 解答

剑指offer—把字符串转换为整数

题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0

输入

+2147483647
    1a33

输出

2147483647
    0

思路

用一个数字接收结果,使用*10进位法,每次乘10后加上当前位字符串的值(如果为数字),最后输出这个整数

问题1:

如何确保输入的字符串在整数范围内?-2147483648和2147483647

答:利用正数超过int最大值后再执行加法就是一个负数(溢出)

负数通过在乘10前与int的最小值除以10比较,如果大于或者等于但是剩下的字符>8也就是减去8后小于int最小值,则输出0

if((re==Integer.MIN_VALUE/10&&c-'0'>8)||re<Integer.MIN_VALUE/10) return 0;

问题2:

如何确保整数和负数的值正确?

答:判断第一位符号,如果是+则执行的是加法操作;如果是-则执行的是减法操作。

问题3:

如何判断一个字符是否为数字?

答:char转型成int值时使用了ascii中的数字作为int的值,数字的ascii 0-948-57之间,此外的都不是数字

代码

public class Solution {
    public int StrToInt(String str) {
        int l = str.length();
        int re = 0;
        if(l<=0||l>11) return 0;
        int start = 0;
        if(str.charAt(0)=='+'||str.charAt(0)=='-') start = 1;
        for(int i=start;i<l;i++){
            char c = str.charAt(i);
            if(c>57||c<48) return 0;
            if((re==Integer.MIN_VALUE/10&&c-'0'>8)||re<Integer.MIN_VALUE/10) return 0;
            re *= 10;
            if(str.charAt(0)=='-'){
                re -= c-'0';
            }else{
                re += c-'0';
                if(re<0) return 0;
            }
        }
        return re;
    }
}

扩展—LeetCode8—字符串转换整数

题目描述

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围,请返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

输入: "42"
输出: 42
示例 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
示例 3:

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
示例 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     因此无法执行有效的转换。
示例 5:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
     因此返回 INT_MIN (−231) 。

思路

思路向上,需要变的如下:

  1. 前后空格使用trim处理
  2. 不限制字符串长度
  3. 如果找到一个不满足条件的字符,直接返回已经计算好的数字
  4. 对过大过小的值重新判断,在*10之前与Integer的最大值和最小值除以10进行判断,如果超过则返回最大值或者最小值

代码

class Solution {
    public int myAtoi(String s) {
        String str = s.trim();
        int l = str.length();
        int re = 0;
        if(l<=0) return 0;
        int start = 0;
        if(str.charAt(0)=='+'||str.charAt(0)=='-') start = 1;
        for(int i=start;i<l;i++){
            char c = str.charAt(i);
            if(c>57||c<48) return re;
            if(re>Integer.MAX_VALUE/10||re<Integer.MIN_VALUE/10) return re>0?Integer.MAX_VALUE:Integer.MIN_VALUE;
            re *= 10;
            if(str.charAt(0)=='-'){
                re -= c-'0';
                if(re>0) return Integer.MIN_VALUE;
            }else{
                re += c-'0';
                if(re<0) return Integer.MAX_VALUE;
            }
        }
        return re;
    }
}
  • 本文作者: dzou | 微信:17856530567
  • 本文链接: http://www.dzou.top/post/string-to-int.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!