LeetCode-字符串转整数
LeetCode刷题笔记
LeetCode题库:https://leetcode-cn.com/problemset/all/
字符串转整数
给定字符串,将其转化成一个32位有符号整数
思路
字符串去除前导空格后,遍历字符串并根据以下条件依次判断字符串是否符合要求
- 判断字符串是否为单个非数字字符;
- 判断是否以数字或正负号开头;
- 判断除去正负号后是否以非数字符号开头。
最后获取截取的数字部分并判断大小,返回结果。
代码实现
var myAtoi = function(s) {
if (s.length === 1 && isNaN(s) && s !== ' ') return 0; // 排除单个非数字字符
s = s.replace(/^ */g, ''); // 去掉前导空格
const condition = {
'+': true,
'-': false
}
/**
* 判断第一个字符是否符合条件
* 首先判断第一个字符是否为数字,是则返回true,反之再进一步判断
* 判断字符是否为正负号,不是则赋值为undefined
*/
var isPositive = isNaN(s[0]) ? condition[s[0]] : true;
if (isPositive === undefined) return 0; // 不符合条件的字符返回 0
s = s.slice(isNaN(s[0]) ? 1 : 0); // 除去正负号
var end = 1; // 数字结束位置初始化
// 遍历字符串
for (let i = 0; i < s.length; i++) {
end = i > end ? i : end; // 更新结束位置
if (isNaN(s[i]) || s[i] === ' ') {
if (i === 0) { // 排除去除正负号后仍以非数字字符开头的字符串
return 0;
} else {
// 发现非数字字符,跳出循环
break;
}
}
}
var result = parseInt(s.slice(0, end + 1)); // 截取数字部分
result = isPositive ? result : -result; // 改变数字正负
// 判断结果是否超出区间
if (isPositive) {
result = result > Math.pow(2, 31) - 1 ? Math.pow(2, 31) - 1 : result;
} else {
result = result < Math.pow(-2, 31) ? Math.pow(-2, 31) : result;
}
return result;
};
运行结果
执行用时 | 内存消耗 |
---|---|
104 ms | 39.4 MB |