8.字符串转换整数 (atoi)
解题思路
package leadcode;
/**
* @author : icehill
* @description : 字符串转换整数 (atoi)
* 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
* <p>
* 函数 myAtoi(string s) 的算法如下:
* 读入字符串并丢弃无用的前导空格
* 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。
* 如果两者都不存在,则假定结果为正。
* 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
* 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。
* 如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
* 如果整数数超过 32 位有符号整数范围 [−2^31, 2^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,
* 小于 −^231 的整数应该被固定为 −2^31 ,
* 大于 2^31 − 1 的整数应该被固定为 2^31 − 1 。
* 返回整数作为最终结果。
* 注意:
* <p>
* 本题中的空白字符只包括空格字符 ' ' 。
* 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
* <p>
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/string-to-integer-atoi
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
* <p>
* 解题思路:
* 根据题目描述,直接沿用常规的做法即可,
* 遍历字符串,根据题目设定的条件一一处理
* 1.先去除前后空格(去除前空格即可)
* 2.对于去除空格后的字符,判断第一个字符是否为符号位,并确定输出结果是否为负数
* 3.从第0或者1个字符开始遍历,直到s[i]不是数字,num=num*10+s[i]
* 对于3,需要先判断空字符
* 其次,判断是否溢出(-2^31~2^31-1)
* num=num*10+s[i]
* 由于s[i]是字符类型,需要转成数字,根据ASCII码,可以知道'0'对应48,
* 所以java表达式可以写成:num=num*10+s[i]-48;
* @date : 2021-04-11
*/
public class Solution8 {
public static void main(String[] args) {
Solution8 solution8 = new Solution8();
System.out.println(solution8.myAtoi("42"));
System.out.println(solution8.myAtoi(" -42"));
System.out.println(solution8.myAtoi("words and 987"));
System.out.println(solution8.myAtoi("-91283472332"));
System.out.println(solution8.myAtoi(""));
System.out.println(solution8.myAtoi("1"));
System.out.println(solution8.myAtoi("-2147483647"));
}
public int myAtoi(String s) {
int num = 0;
s = s.trim();
if (s.isEmpty()) {
return num;
}
//是否负数
boolean isNegative = false;
//是否有符号
boolean isSynmbol = false;
if (s.charAt(0) == '-') {
isSynmbol = true;
isNegative = true;
}
if (s.charAt(0) == '+') {
isSynmbol = true;
}
//32为有符号整数最大
int maxValue = Integer.MAX_VALUE;
//正数最大尾数是7
int minValue = Integer.MIN_VALUE;
//负数最大尾数是8
for (int i = isSynmbol ? 1 : 0; i < s.length(); i++) {
if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
//溢出处理,在不使用64位无符号整数的情况下
//对于正整数,判断num*10+n>Integer.MAX_VALUE
//等价于 num>= Integer.MAX_VALUE/10 或者num==Integer.MAX_VALUE/10 && n>=Integer.MAX_VALUE%10
if (!isNegative && (num > maxValue / 10 || (num == maxValue / 10 && (s.charAt(i) - 48 >= 7)))) {
return maxValue;
}
if (isNegative && ((num > maxValue / 10) || (num == maxValue / 10 && (s.charAt(i) - 48 >= 8)))) {
return minValue;
}
num = num * 10 + s.charAt(i) - 48;
} else {
break;
}
}
return isNegative ? num * -1 : num;
}
}