7,整數反轉
7,整數反轉
1,原題
給你一個 32 位的有符號整數 x ,返回將 x 中的數字部分反轉後的結果。
如果反轉後整數超過 32 位的有符號整數的範圍[-2147483648,2147483647] ,就返回 0。
假設環境不允許儲存 64 位整數(有符號或無符號)。
示例 1:
輸入:x = 123
輸出:321
示例 2:
輸入:x = -123
輸出:-321
示例 3:
輸入:x = 120
輸出:21
示例 4:
輸入:x = 0
輸出:0
LeetCode地址:
https://leetcode-cn。com/problems/reverse-integer/
2,題目分析
本題考察了兩個知識點
1,數學知識點:整數反轉怎麼透過數學運算實現?
資料用10取餘後除以10,非0情況一直如此迴圈下去,可反向依次拿出每個數字。
反向取數字過程中,結果依次乘以10,然後加當前位數字,迴圈結束可獲得反轉
之後的資料。
2,整數在記憶體中的儲存原理:int型別越界的原理,引申出整數在記憶體中如何儲存?
需要了解二進位制碼在記憶體中的儲存原理,int越界之後對資料的影響。
要特別說明的是,題目要求環境不允許儲存64位整數,網上有些js,python的解答
直接使用最終結果和int極值比較大小,判斷是否返回0的方法,結果正確,但是不規範。
因為在32位4位元組int環境中,不可能出現比極大值大或者比極小值小的整數,因此也無法比較大小。
3,程式碼例項
C語言實現
1,迴圈
// x int 要反轉的數字
int reverseLoop(int x) {
if(x == 0){
return 0;
}
int res = 0;
int tmp=0;
while (x != 0) {
tmp=x%10;
x/=10;
if( res>INT_MAX/10 || (res==INT_MAX/10 && (tmp)>7) ){
return 0;
}
if( res return 0; } res = res*10+(tmp); tmp=0; } return res; } 2,遞迴 //x int 要反轉的數字 //反轉之後結果的地址,指標變數,初始值為0 void reverseRecursion(int x,int *res) { if(x==0) return ; int tmp=x%10; x = x/10; if( *res>INT_MAX/10 || (*res==INT_MAX/10 && (tmp)>7) ){ *res=0; return ; }else if( *res *res=0; return ; }else { *res = *res * 10 + tmp; reverseRecursion(x, res); } } //呼叫遞迴方法 void main() { int res=0; int x = 123456789; reverseRecursion(x,&res) printf(“%d\n”, res); }
下一篇:豬肝是黃色的可以吃嗎?