原題目鏈接:7.整數反轉
題目描述:
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
注意:
假設我們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [, − 1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0。
示例 1:
輸入:x = 123
輸出:321
示例 2:
輸入:x = -123
輸出:-321
示例 3:
輸入:x = 120
輸出:21
示例 4:
輸入:x = 0
輸出:0
提示:
<= x <= - 1
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/reverse-integer
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
做題思路:
- 我們先了解兩個知識點
- 第一點,注意看題目,我們需要對反轉後的數據進行計算,首先,我們知道int類型的取值範圍是【 , - 1】即: -2147483648 ~ 2147483647 ,所以也就是說,當我們反轉後的數據不在【 , - 1】這個區間裏面,則會出現溢出現象,根據題目,一旦出現溢出現象,就返回0
- 我們舉幾個例子來了解一下,例如我們假設規定的區間是【, - 1】,即:-512 ~ 511,只要不在這個區間的反轉數據就算溢出
3.1 例如x = 125,將其反轉後就是521,因爲521 > 511,所以溢出
3.2 例如x = 315,將其反轉後就是513,以爲513 > 511,所以溢出
4. 第二點,int類型是自動取整的,例如 125 / 10 = 12,例如 315 / 10 = 31,以上的所有數據都是int類型,也就是說,jvm自動幫我們去掉了餘數,也就是小數點的後面,這個知識點稱爲自動取整。
5.在瞭解完兩個知識點之後,開始分析如何進行數據反轉(x是題目給出的要進行反轉的數據)
5.1 我們對x不斷地餘10,也就是%10,得出從個位數開始的每個數字,例如 125 ,第一次%10之後,125 -> 12.5 -> 5
5.2 在不斷地對x取餘的同時,從個位數開始,用ans進行拼接
5.3 在拼接之後,記得要對x不斷地除10,自動取整,因爲取出的各個數字已經拼接到ans了,所以要通過除10去掉
我們以x = 123反轉進行自制動畫演示
點擊這裏在B站看動畫演示喔,喜歡的客官可以點點關注,謝謝
廢話不多說,直接上代碼,爲了讓各位看官更能清晰理解,我的代碼寫得不精簡,我的代碼里加了大量的註釋,相信各位看官可以理解,如果我有些沒寫清楚或者寫錯的,可以評論區或者私信我喔
public int reverse(int x) {
//這個代表反轉後的數據
//ans是answer的縮寫
int ans = 0;
while( x != 0){
//判斷是否溢出
//由於int類型超出後會變成long類型
//所以在*10 / 10之後仍然等於int類型,就說明還沒有溢出現象
if((ans * 10) / 10 != ans){ //如果不是int類型了
//發生溢出現象,返回0
ans = 0;
break;
}
//ans的拼湊
ans = ans * 10 + x % 10;
//x是int類型,所以會自動取整
x = x / 10;
}
return ans;
}