CSS HTML jQuery 實現嗶哩嗶哩頭部移動冬.日夜時差圖
題意
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
注意:
- 假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為
[−2^31, 2^31 − 1]
。請根據這個假設,如果反轉後整數溢位那麼就返回 0。
示例
示例 1:
輸入:x = 123
輸出:321
示例 2:
輸入:x = -123
輸出:-321
示例 3:
輸入:x = 120
輸出:21
示例 4:
輸入:x = 0
輸出:0
提示:
-2^31 <= x <= 2^31 - 1
出處
連結:https://leetcode-cn.com/problems/reverse-integer
思路
這題假如是個小學一年級的期末考試題,我們大概會這麼做,從右邊往左邊讀然後依次寫下來,如果讀到最後一個是“-”減號,我們就把它放到寫下數字的最前面。言下之意就是,我不要把它看成數字處理,我把它看成字串,然後一翻轉。這裡考慮下帶不帶負號,假設帶上吧,那你就要考慮最後那位是不是“-”了,如果不帶吧,那你就要判斷它原值是正數還是負數了。
這裡需要注意的是在 Javascript 語言中,Number 型別的範圍是[-2^53 - 1, 2^53 - 1]
,所以如果你轉換成字串處理,你是感受不到溢位的,需要去人肉判斷一波,該值是否在題意給定的[−2^31, 2^31 − 1]
區間。除此之外,Javascript 的字串中並沒有字串反轉的 API,但是有陣列反轉的 API,所以曲線救國,就先轉成字串然後轉成陣列反轉再轉回字串。這個是完全根據 Javascript 語言特性和小學生思維的解法寫的。
當然啦,你也可以按照數字去解題,如果原值不為 0,將原值對於 10 取其餘數塞到新組成的字串的後面,新的原值等於原值整除 10, 前提你還是要先判斷有沒有溢位,然後該值的正負性。然後如果該值不為 0,要去掉開頭的 0, 如示例 3 所示.
程式碼
/** * @param {number} x * @return {number} */ const reverse = function(x) { const str = Math.abs(x).toString(); const str_reverse = str.split('').reverse().join(''); return x >= 0 ? Number(str_reverse) > Math.pow(2, 31) - 1 ? 0 : Number(str_reverse) : -Number(str_reverse) < Math.pow(-2, 31) ? 0 : -Number(str_reverse); }; export default reverse;
測試
import twoSum from '../../code/leetcode/7';
describe('test function reverse:', () => {
test('test case x = 123', () => {
const res = twoSum(123);
expect(res).toBe(321);
});
test('test case x = -123', () => {
const res = twoSum(-123);
expect(res).toBe(-321);
});
test('test case x = 120', () => {
const res = twoSum(120);
expect(res).toBe(21);
});
test('test case x = 0', () => {
const res = twoSum(0);
expect(res).toBe(0);
});
test('test case x = 1534236469', () => {
const res = twoSum(1534236469);
expect(res).toBe(0);
});
})
思考
-
就上面提到的用數字取餘數的解法,有興趣的同學可以取試下
-
題目中給出的區間具體值是多大
2^31-1=2147483647,-2^31=-2147483648
參考
JS 的 Number 型別: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number
說明
本文首發於 GitHub 倉庫https://github.com/ataola/coding
,線上閱讀地址:https://zhengjiangtao.cn/coding/
,轉載請註明出處,謝謝!