问题描述:
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。算法的具体规则可以查阅链接。
简单分析:
题目比较简单,遍历字符串,对各个字符串按照规则逐个处理即可。在翻阅官方题解中,发现状态机的实现算法,减少冗余代码,关于这部分可以参阅《有限状态机FSM实现》。
编码:
class Solution {
public int myAtoi(String s) {
if (s==null||s.isEmpty()){
return 0;
}
int ret = 0;
int ratio = 1;
boolean start = false;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch == '+'){
if (!start){
start = true;
}else {
return ret * ratio;
}
}else if (ch == '-'){
if (!start){
start = true;
ratio = -1;
}else {
return ret* ratio;
}
}else if (ch >= '0'&& ch <= '9'){
if (!start){
start = true;
}
var reverse = reverse(ret *ratio, (ch - '0')* ratio);
if (reverse[0] == 1){
return reverse[1];
}
ret = Math.abs(reverse[1]);
}else if(ch == ' '){
if (start){
return ret * ratio;
}
}else{
return ret * ratio;
}
}
return ret* ratio;
}
private int[] reverse(int cur, int x) {
int[] ret = new int[2];
if (cur > 214748364 ||(cur == 214748364 && x > 7)){
ret[0] = 1;
ret[1] = Integer.MAX_VALUE;
return ret;
}
if (cur < -214748364 || (cur == -214748364 && x < -8)){
ret[0] = 1;
ret[1] = Integer.MIN_VALUE;
return ret;
}
ret[1] = cur * 10 + x;
return ret;
}
}