这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战
**1.leetcode 字符串转换整数 (atoi)
请你来实现一个 myAtoi(string s)
函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi
函数)。
注意:
- 本题中的空白字符只包括空格字符
' '
。 - 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
示例 1:
输入:s = "42"
输出:42
示例 2:
输入: s = " -42"
输出: -42
示例 3:
输入: s = "4193 with words"
输出: 4193
按题目要求将一个字符串转为32位有符号整数,整数那么就不用管小数点了,字符串可以为英文、数字、一些符号组成(空格、正负号),并且只需要获取最近的一个数字字符。按题目思路来,首先字符串可能会有不定数量的前导空格,这些是无用的,我们需要忽略掉,然后读取下一个非空格字符,这个字符可能是正负号,如果是的话需要记录下来,以便确定最终结果的符号,然后在读取下一个字符如果没有则默认为正,从这开始一直读取字符,直到遇到非数字字符终止,同时获取的数字用一个长整形保存,这样可以判断如果目前读取到的数字超过32位有符号的整形就是溢出了,就需要直接返回其范围的最大值,但是这里获取的数字是无符号的,所以需要根据前面记录的符号判断返回其对应的最大值。否则最后将长整形转为32为数返回。
class Solution {
public int myAtoi(String s) {
long res = 0L;
// 是否为负数
boolean negativeNumber = false;
int len = s.length();
// 临时索引,记录第一个非空格或者正负号的索引下标
int indexTemp = 0;
char ascii;
for (int i = 0; i < len; i++) {
ascii = s.charAt(i);
// 丢弃无用的前导空格
if (ascii == ' ') {
continue;
}
// 读取到下一个非空格字符
indexTemp = i;
// 如果有正负号
if (ascii == '+' || ascii == '-') {
// 再往下一个
indexTemp++;
// 记录正负数
negativeNumber = ascii == '-';
}
break;
}
// 从这里开始获取数字
for (int i = indexTemp; i < len; i++) {
ascii = s.charAt(i);
// 不是数字,就直接结束
if (ascii < '0' || '9' < ascii) {
break;
}
// 依次获取数字,这个数字是无符号的
res = res * 10 + (ascii - '0');
// 判断如果溢出32有符号整数,就返回其最大值
if (res > Integer.MAX_VALUE) {
return negativeNumber ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
}
// 最后根据情况是否加上符号
if (negativeNumber) {
res *= -1;
}
return (int) res;
}
}