字符串转换整数

LeetCode,8. String to Integer (aoti)

先看题目描述

大意就是给定一个字符串,实现一个将其转换成整数的函数,该函数会丢弃开头无用的空格字符,直到碰到第一个非空字符,若第一个非空字符不为 ‘+’ 或 ‘-‘ 或 数字,则直接返回0;然后将之后的部分转化为整数,直至碰到不是数字的字符

算法和思路

算法流程

  • 初始化 ans = 0,flag = true

  • 定义 left 和 right 两个指针分别指向字符串一头一尾,然后 left 和 rright 向内移动,直至遇到非空字符,若 left 和 right 停止移动时,left > right,说明字符串内全是空格,返回 0

  • left 和 right 停止移动时,判断此时 s[left] 是否为 ‘+’ 或 ‘-‘ 或数字,若均不是的话,则直接返回 0;若是 + 或 - 的话,则将 left + 1;若是 - 的话,则同时将 flag 置为 false

  • 右移 left 指针来遍历 left 和 right 之间部分,若 s[left] 是数字,则 pre = ans,ans = ans * 10 + s[left];同时还要比较此时的 pre 与 ans / 10,若不相等,则说明 ans 溢出了,根据 flag 的值来返回 Integer.MAX_VALUE 或 Integer.MIN_VALUE;若 s[left] 不为数字,则跳出循环

  • 若 flag 为 true,则返回 ans;否则,返回 -ans

算法源码

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
class Solution {
public int myAtoi(String s) {
int len = s.length();
int left = 0;
int right = len - 1;
boolean flag = true;
int ans = 0;
while (left < len && s.charAt(left) == ' ') {
left++;
}
while (right >= 0 && s.charAt(right) == ' ') {
right--;
}
if (left > right) return 0;
char c = s.charAt(left);
if (c - '0' != -3 && c- '0' != -5 && !isValid(c)) return 0;
if (c - '0' == -3) flag = false;
if (!isValid(c)) left++;
while (left <= right) {
int num = s.charAt(left) - '0';
if (num < 0 || num > 9) {
break;
}
int pre = ans;
ans = ans * 10 + num;
if (pre != ans / 10) {
if (flag) return Integer.MAX_VALUE;
else return Integer.MIN_VALUE;
}
left++;

}
if (flag) return ans;
else return -ans;
}

private boolean isValid(char c) {
return c -'0' >= 0 && c - '0' <= 9;
}
}