package com.heu.wsq.leetcode.inoffer;
/**
* 剑指 Offer 67. 把字符串转换成整数
* @author wsq
* @date 2021/1/25
* 写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。
* 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
* 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
* 该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
* 注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
* 在任何情况下,若函数不能进行有效的转换时,请返回 0。
* 说明:
* 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
*
* 示例 1:
* 输入: "42"
* 输出: 42
*
* 链接:https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/58pq8g/
*/
public class Offer67 {
public int strToInt(String str){
str = str.trim();
int n = str.length();
if (n == 0){
return 0;
}
int res = 0;
int flag;
char c = str.charAt(0);
if (c == '-'){
flag = 0;
}else if (c >= '0' && c <= '9' || c == '+'){
flag = 1;
res = c == '+' ? 0 : c - '0';
}else {
return 0;
}
for (int i = 1; i < n; i++){
c = str.charAt(i);
if (c < '0' || c > '9'){
break;
}
if (res > Integer.MAX_VALUE / 10 || (Integer.MAX_VALUE / 10 == res && c - '0' > 7)){
return flag == 0 ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
res = res * 10 + c - '0';
}
// System.out.println(Integer.MAX_VALUE);
return flag == 0 ? -res : res;
}
public static void main(String[] args) {
String s = "-2147483649";
Offer67 offer67 = new Offer67();
int ans = offer67.strToInt(s);
System.out.println(ans);
}
}