这方法的条件有
- 前面可以是连续空白,但不能出现字符
- 前面有字符返回0
- 前面可以有+-
- 数字后面的字母会被删掉
- 解后的数字如果超出 [Math.pow(-2,31), Math.pow(2,31)-1], 返回这些极限值
function myAtoi(str) {
var map = new Array(10).fill(1).reduce((ret, el, index) => {
ret[index] = 1
return ret
}, {})
map['-'] = 1;
map['+'] = 1;
var hasNum = false, ret = ''
for (var i = 0; i < str.length; i++) {
var c = str[i]
if (!hasNum) {
if (map[c]) {
ret += c;
//符合只能匹配一次
if (c === '+' || c == '-') {
delete map['+']
delete map['-']
}
hasNum = true
} else {
if (c == ' ') {
continue
}
return 0
}
} else {
if (map[c]) { //- + 1
ret += c;
} else {
break
}
}
}
var parsedString = parseInt(ret);
if (isNaN(parsedString)) {
return 0;
}
if (parsedString >= Math.pow(2, 31)) {
return Math.pow(2, 31) - 1;
}
if (parsedString < Math.pow(-2, 31)) {
return Math.pow(-2, 31);
}
return parsedString
};
console.log(myAtoi('-91283472332'))
或者直接动用正则,将前面的有效字符匹配出来
function myAtoi(str) {
var a = str.match(/^s*([+-]?d+)/)
if (a && a[1]) {
var num = Number(a[1]);
if (num < 0) {
return Math.max(-Math.pow(2, 31), num)
}
return Math.min(Math.pow(2, 31) - 1, num)
} else {
return 0
}
};
JS中还能直接作弊
var myAtoi = function(str) {
let parsedString = parseInt(str);
if(parsedString >= Math.pow(2,31)) {
return Math.pow(2,31) - 1;
}
if(parsedString < Math.pow(-2,31)) {
return Math.pow(-2,31);
}
if(isNaN(parsedString)) {
return 0;
}
return parsedString;
};