一、題目
LeetCode-7.整數(shù)反轉(zhuǎn)
鏈接:https://leetcode-cn.com/problems/reverse-integer/
難度:簡(jiǎn)單
給你一個(gè)32位的有符號(hào)整數(shù)x,返回將x中的數(shù)字部分反轉(zhuǎn)后的結(jié)果。
如果反轉(zhuǎn)后整數(shù)超過32位的有符號(hào)整數(shù)的范圍 [?2^31, 2^31 ? 1] ,就返回 0。
假設(shè)環(huán)境不允許存儲(chǔ) 64 位整數(shù)(有符號(hào)或無符號(hào))。
示例 1:
輸入:x = 123
輸出:321
示例 2:
輸入:x = -123
輸出:-321
示例 3:
輸入:x = 120
輸出:21
提示:
-2^31 <= x <= 2^31 - 1
二、解題思路
首先我們想一下,怎么去反轉(zhuǎn)一個(gè)整數(shù)?
把整數(shù)變成字符串,再去反轉(zhuǎn)這個(gè)字符串嗎?
這種方法是可以的,但是并不好。實(shí)際上我們只要能拿到這個(gè)整數(shù)的末尾數(shù)字就可以了。
以123為例,先拿到3,再拿到2,最后是1,然后按照順序拼接就達(dá)到反轉(zhuǎn)的效果了。
那么問題又來了,怎么拿到末尾數(shù)字呢?這個(gè)比較簡(jiǎn)單,取模就好了。
本題還要考慮負(fù)數(shù)的情況,所以判斷條件不是x>0,而是x!=0。
最后就是判斷反轉(zhuǎn)后的數(shù)是否會(huì)溢出,這個(gè)直接和32位的有符號(hào)整數(shù)214748364比較就行了。
三、實(shí)現(xiàn)過程
c++
class Solution {
public:
int reverse(int x) {
int res = 0;
while(x!=0){
//每次取末尾數(shù)字
int tmp = x%10;
//判斷是否 大于 最大32位整數(shù)
if (res>214748364 || (res==214748364 && tmp>7)) {
return 0;
}
//判斷是否 小于 最小32位整數(shù)
if (res<-214748364 || (res==-214748364 && tmp<-8)) {
return 0;
}
res = res*10 + tmp;
x /= 10;
}
return res;
}
};
PHP
class Solution {
/**
* @param Integer $x
* @return Integer
*/
function reverse($x) {
$res = 0;
while ($x) {
$res = $res * 10 + ($x % 10);
if ($res > 2147483647 || $res < -2147483647) return 0;
$x = intval($x / 10);
}
return $res;
}
}
JavaScript
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let res = 0;
while (x) {
res = res * 10 + (x % 10);
if (res > 2147483647 || res < -2147483647) return 0;
x = parseInt(x / 10);
}
return res;
};
四、小結(jié)
- 時(shí)間復(fù)雜度:O(log∣x∣)。翻轉(zhuǎn)的次數(shù)即x十進(jìn)制的位數(shù)。
- 空間復(fù)雜度:O(1)