Leetcode-008-字符串转数字(atoi)

Leecode-008 String to Integer (atoi)

思路:一次遍历

题目描述:

Example 1:

1
2
Input: "42"
Output: 42

Example 2:

1
2
Input: "   -42"
Output: -42

Example 3:

1
2
Input: "4193 with words"
Output: 4193

Example 4:

1
2
Input: "words and 987"
Output: 0

Example 5:

1
2
Input: "-91283472332"
Output: -2147483648

Solution:

以下三点需要考虑:

  • 数字前面有空格

  • 正负号判断

  • 越界处理

  • 单独字符串转数字 ans = ans * 10 + digit

Java

Solution :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Solution {
public int myAtoi(String str) {
char[] chars = str.toCharArray();
int n = chars.length;
int idx = 0;

// 这里' '中是一个空格
while(idx < n && chars[idx] == ' '){
//去掉前面的空格
idx++;
}

if(idx == n){
//如果去掉空格直接到达末尾
return 0;
}

// 正负标识符
boolean flag = false;
// 遇到负号
if(chars[idx] == '-'){
flag = true;
idx++;
} else if(chars[idx] == '+'){
// 遇到正号
idx++;
} else if (!Character.isDigit(chars[idx])) {
// 其他符号
return 0;
}

int ans = 0;
// 一直遍历到最后并且字符是数字的话
while(idx < n && Character.isDigit(chars[idx])){
int digit = chars[idx] - '0';
// 如果越界了(MAX和MIN判断同样)
if(ans > (Integer.MAX_VALUE - digit)/10){
// 本来应该是 ans * 10 + digit > Integer.MAX_VALUE
// 但是 *10 和 + digit 都有可能越界,所有都移动到右边去就可以了。
return flag?Integer.MIN_VALUE:Integer.MAX_VALUE;
}
ans = ans * 10 + digit;
idx++;
}
return flag?-ans:ans;
}
}

Python

Solution :

1
2


打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信