您當前的位置:首頁 > 攝影

7,整數反轉

作者:由 Camel 發表于 攝影時間:2021-04-28

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);

}

標簽: res  int  10  tmp  整數