今天就來寫第八題~
實作函式 myAtoi(string s),其將一字串轉為一個 32 位元有號整數(類似於 C/C++ 之函式 atoi())
1.去除前導空格:
使用一個迴圈遍歷字串,跳過所有的空白字符,直到找到第一個非空字符的位置 i。
2.判斷符號:
檢查 str[i] 是否為 + 或 - 符號。如果是,則根據符號設定 sign 變數(正數為 1,負數為 -1),然後移動到下一個字符。
3.解析數字:
使用另一個迴圈逐個字符檢查,將每個數字字符轉換為對應的整數並累加到 num 中。這裡通過 num = num * 10 + (str[i] - '0') 來實現數字的累加。
在這個過程中,若有非數字字符出現則停止。
4.溢出檢查:
在每次更新 num 之後,檢查當前值是否超過 32 位整數的範圍。若 num * sign 超過 INT_MAX,則返回 INT_MAX;若小於 INT_MIN,則返回 INT_MIN
5.返回結果:
最後返回 num * sign,即將數字與符號相乘得到最終結果。
/**
* @param {string} str
* @return {number}
*/
var myAtoi = function(str) {
const INT_MAX = 2147483647;
const INT_MIN = -2147483648;
let i = 0;
// 1. 去除前導空格
while (i < str.length && str[i] === ' ') {
i++;
}
// 2. 判斷符號
let sign = 1; // 預設為正數
if (i < str.length && (str[i] === '+' || str[i] === '-')) {
sign = str[i] === '+' ? 1 : -1;
i++;
}
// 3. 解析數字
let num = 0;
while (i < str.length && isDigit(str[i])) {
num = num * 10 + (str[i] - '0');
i++;
// 4. 溢出檢查
if (num * sign > INT_MAX) return INT_MAX;
if (num * sign < INT_MIN) return INT_MIN;
}
return num * sign;
};
// 助手函數:判斷字符是否為數字
function isDigit(char) {
return char >= '0' && char <= '9';
}