1. 题目描述
2. 题目分析
- 对于字符串转为整数,比较简单,这里主要考察的是对于空指针、空字符串、非法输入、全部空格、是否溢出等一些特殊情况
- 首先,我们先考虑有空指针和空字符串情况,
if (str.length() == 0) return 0;
- 空格情况,我们通过
str.trim()
去除空格,然后判断是否全为空格if (c.length == 0) { return 0; }
- 这时候,我们原本的字符串空格已经被我们处理掉了,我们需要判断字符串的正负性,便于我们之后的输出和遍历的开始下标。如果是负号的话,我们需要把标记位设置为-1,起始下标设置为1,如果是正号的话,我们需要把标记位设置为1,起始下标设置为1,如果什么都不是的话,我们需要把起始下标设置为0
- 处理非法输入:如果我们在遍历字符串的过程中,遇到
if (c[i] < '0' || c[i] > '9') { break; }
直接break,返回目前的sum即可。 - 溢出:因为我们的int的范围为
Integer.MIN_VALUE ~ Integer.MAX_VALUE
所以,我们在判断的时候,if (sum > dny || sum == dny && c[i] > '8') { return flag == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE; }
此处的dny == Integer.MAX_VALUE/10
- 最后返回sum与标记位的乘积
3. 题目代码
public int StrToInt(String str) { if (str.length() == 0) { return 0; } char[] c = str.trim().toCharArray(); // 去除空格 if (c.length == 0) { return 0; } // 判断第一个符号位是 int flag = 1; int num = 1; // 我们判断第一个字符 是不是‘+’ ‘-’ 如果是的话 我们从下标1开始遍历 // 如果不是,我们从下标0开始遍历 if (c[0] == '-') { flag = -1; } else if (c[0] != '+') { num = 0; } int sum = 0; int dny = Integer.MAX_VALUE / 10; for (int i = num; i < c.length; i++) { // 也就是如果其中出现了非数字的数,我们直接判断这是一个无效输出 // 返回0 if (c[i] < '0' || c[i] > '9') { return 0; } if (sum > dny || sum == dny && c[i] > '8') { return flag == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE; } sum = sum * 10 + (c[i] - '0'); } return sum * flag; }