题目:
给定一个字符串 str,如果str符合日常书写的整数形式,并且属于 32 位整数的范围,返回 str 所代表的整数值,否则返回 0 。
举例:
str = "123" 返回 123
str = "023" 返回 23
str = "2147483647" 返回 2147483647
str = "2147483648" 返回0,因为溢出了
str = "-123" 返回 -123
思路:
检查是否合法:
public static boolean isValid(char[] chas) {//排除不以符号和数字开头的if (chas[0] != '-' && (chas[0] < '0' || chas[0] > '9')) {return false;}//排除 ‘-’ 和 ‘-023’ 这种的if (chas[0] == '-' && (chas.length == 1 || chas[1] == '0')) {return false;}//排除以0开头的if (chas[0] == '0' && chas.length > 1) {return false;}//检查字符串其他位置是不是都是数字 如果有不是的返回 falsefor (int i = 1; i < chas.length; i++ ) {if (chas[i] < '0' || chas[i] > '9') {return false;}}return true;}
如果str不符合日常书写的整数形式,根据题目要求,直接返回0即可。
如果符合,进行如下转换过程:
不管是正数还是负数,转换过程都以 负数的形式出现,然后根据前面的 '-' ,如果有负号,结果保持不变,如果没有'-',去掉结果前面的负号。
例如:
str = "123" 转换为结果时 -123,posi= true,最后返回 123
str = "-123" 转换为结果时 -123,posi= false,最后返回 -123
判断溢出问题:
public static int convert(String str) {if (str == null || str.equals("")) {return 0;}char[] chas = str.toCharArray();if (!isValid(chas)) {return 0;}boolean posi = chas[0] == '-' ? false : true;int minq = Integer.MIN_VALUE / 10;int minr = Integer.MAX_VALUE % 10;int res = 0;int cur = 0;//如果是以 ‘-’ 开头,就从 1 位置遍历,如果不是,就从0位置开始遍历for (int i = posi ? 0 : 1; i < chas.length; i++) {//拿到当前字符的负数形式cur = '0' - chas[i];//判断是否溢出if ((res < minq) || (res == minq && cur < minr)) {return 0;}res = res * 10 + cur;}if(posi && res == Integer.MIN_VALUE) {return 0;}return posi ? -res : res;}