面试题67. 把字符串转换成整数
题目:
思路:
【1】以下四种字符需要考虑:
首部空格: 删除之即可;
符号位: 三种情况,即 '+' , '− , '无符号' ;新建一个变量保存符号位,返回前判断正负即可。
非数字字符: 遇到首个非数字的字符时,应立即返回。
数字字符:
字符转数字: “此数字的 ASCII 码” 与 “ 0 的 ASCII 码” 相减即可;
数字拼接: 若从左向右遍历数字,设当前位字符为 c ,当前位数字为 x ,数字结果为 res ,则数字拼接公式为:
res=10×res+x
x=ascii(c)−ascii(′0′)
代码展示:
利用函数清空空格:
//时间1 ms击败100% //内存41.3 MB击败59.83% //时间复杂度 O(N): 其中 N 为字符串长度,线性遍历字符串占用O(N)时间。 //空间复杂度 O(N): 删除首尾空格后需建立新字符串,最差情况下占用O(N)额外空间。 class Solution { public int strToInt(String str) { char[] c = str.trim().toCharArray(); if(c.length == 0){ return 0; } int res = 0, bndry = Integer.MAX_VALUE / 10; int i = 1, sign = 1; if(c[0] == '-'){ sign = -1; }else if(c[0] != '+') { i = 0; } for(int j = i; j < c.length; j++) { if(c[j] < '0' || c[j] > '9'){ break; } if(res > bndry || res == bndry && c[j] > '7'){ return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE; } res = res * 10 + (c[j] - '0'); } return sign * res; } }
如果不能使用函数:
既然不能使用函数了,肯定是先循环一下将位置调到第一个不为空格的字符下面。
//时间1 ms击败100% //内存41.6 MB击败29.18% class Solution { public int strToInt(String str) { int res = 0, bndry = Integer.MAX_VALUE / 10; int i = 0, sign = 1, length = str.length(); if(length == 0){ return 0; } while(str.charAt(i) == ' '){ if(++i == length){ return 0; } } if(str.charAt(i) == '-'){ sign = -1; } if(str.charAt(i) == '-' || str.charAt(i) == '+') { i++; } for(int j = i; j < length; j++) { if(str.charAt(j) < '0' || str.charAt(j) > '9'){ break; } if(res > bndry || res == bndry && str.charAt(j) > '7'){ return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE; } res = res * 10 + (str.charAt(j) - '0'); } return sign * res; } }