leetcode - 字符串轉(zhuǎn)換整數(shù) (atoi)
題意
請你來實(shí)現(xiàn)一個(gè) ?atoi? 函數(shù),使其能將字符串轉(zhuǎn)換成整數(shù)。
首先,該函數(shù)會根據(jù)需要丟棄無用的開頭空格字符,直到尋找到第一個(gè)非空格的字符為止。接下來的轉(zhuǎn)化規(guī)則如下:
如果第一個(gè)非空字符為正或者負(fù)號時(shí),則將該符號與之后面盡可能多的連續(xù)數(shù)字字符組合起來,形成一個(gè)有符號整數(shù)。假如第一個(gè)非空字符是數(shù)字,則直接將其與之后連續(xù)的數(shù)字字符組合起來,形成一個(gè)整數(shù)。該字符串在有效的整數(shù)部分之后也可能會存在多余的字符,那么這些字符可以被忽略,它們對函數(shù)不應(yīng)該造成影響。假如該字符串中的第一個(gè)非空格字符不是一個(gè)有效整數(shù)字符、字符串為空或字符串僅包含空白字符時(shí),則你的函數(shù)不需要進(jìn)行轉(zhuǎn)換,即無法進(jìn)行有效轉(zhuǎn)換。
在任何情況下,若函數(shù)不能進(jìn)行有效的轉(zhuǎn)換時(shí),請返回 0 。
注意:
本題中的空白字符只包括空格字符
' '。假設(shè)我們的環(huán)境只能存儲
32位大小的有符號整數(shù),那么其數(shù)值范圍為 ?[?2^31, 2^31 ? 1]。如果數(shù)值超過這個(gè)范圍,請返回 ?2^31 ? 1 或 ?2^31。
示例
示例 ?1:
輸入:?"42"
輸出:?42
示例 ?2:
輸入:?"?-42"
輸出:?-42
解釋:?第一個(gè)非空白字符為?'-', 它是一個(gè)負(fù)號。
??我們盡可能將負(fù)號與后面所有連續(xù)出現(xiàn)的數(shù)字組合起來,最后得到?-42 。
示例 ?3:
輸入:?"4193?with?words"
輸出:?4193
解釋:?轉(zhuǎn)換截止于數(shù)字?'3'?,因?yàn)樗南乱粋€(gè)字符不為數(shù)字。
示例 ?4:
輸入:?"words?and?987"
輸出:?0
解釋:?第一個(gè)非空字符是?'w', 但它不是數(shù)字或正、負(fù)號。
因此無法執(zhí)行有效的轉(zhuǎn)換。
示例 ?5:
輸入:?"-91283472332"
輸出:?-2147483648
解釋:?數(shù)字?"-91283472332"?超過 32 位有符號整數(shù)范圍。
??因此返回 INT_MIN (?231)?。
提示
0 <= s.length <= 200s 由英文字母(大寫和小寫)、數(shù)字、' '、'+'、'-' 和 '.' 組成
出處
鏈接:https://leetcode-cn.com/problems/string-to-integer-atoi
思路
這題真的沒啥好講的,因?yàn)轫樦}目的描述就能出答案,首先的話就是字符串開頭去空,這件事情你可以交給trim函數(shù),然后下面三種情況它也給你理出來了,照著翻譯唄。后來又補(bǔ)了句無法轉(zhuǎn)化就返回 0,然后把目光轉(zhuǎn)到注意,這里它確定了數(shù)值的最大最小值要注意下。
代碼
/**
?*?@param?{string}?s
?*?@return?{number}
?*/
const?myAtoi?=?function?(s)?{
??s?=?s.trim();
??if?(!s?||?/[a-z]/.test(s[0]))?{
????return?0;
??}
??const?res?=?parseInt(s);
??if?(!res)?{
????return?0;
??}
??const?min?=?Math.pow(-2,?31);
??const?max?=?-min?-?1;
??return?res??max???max?:?res;
};
export?default?myAtoi;
測試
import?myAtoi?from?'../../code/leetcode/8';
describe('test?function?myAtoi:?',?()?=>?{
??test('test?case?s?=?"42"',?()?=>?{
????const?res?=?myAtoi('42');
????expect(res).toBe(42);
??});
??test('test?case?s?=?"?-42"',?()?=>?{
????const?res?=?myAtoi('?-42');
????expect(res).toBe(-42);
??});
??test('test?case?s?=?"4193?with?words"',?()?=>?{
????const?res?=?myAtoi('4193?with?words');
????expect(res).toBe(4193);
??});
??test('test?case?s?=?"words?and?987"',?()?=>?{
????const?res?=?myAtoi('words?and?987');
????expect(res).toBe(0);
??});
??test('test?case?s?=?"-91283472332"',?()?=>?{
????const?res?=?myAtoi('-91283472332');
????expect(res).toBe(-2147483648);
??});
});
說明
本文首發(fā)于 GitHub 倉庫https://github.com/ataola/coding,線上閱讀地址:https://zhengjiangtao.cn/coding/,轉(zhuǎn)載請注明出處,謝謝!
