7.整數(shù)反轉(zhuǎn)
題目
給出一個(gè) 32 位的有符號(hào)整數(shù)肝谭,你需要將這個(gè)整數(shù)中每位上的數(shù)字進(jìn)行反轉(zhuǎn)氛悬。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:
假設(shè)我們的環(huán)境只能存儲(chǔ)得下 32 位的有符號(hào)整數(shù),則其數(shù)值范圍為 [?231 , 231 ? 1]。請(qǐng)根據(jù)這個(gè)假設(shè)俄占,如果反轉(zhuǎn)后整數(shù)溢出那么就返回 0。
注意點(diǎn)
- 數(shù)字的翻轉(zhuǎn)并不難淆衷,比較容易出錯(cuò)的是怎樣才能保證翻轉(zhuǎn)后的數(shù)組不能夠溢出缸榄。
我的寫法
class Solution {
public int reverse(int x) {
boolean negative = false;//用一個(gè)布爾值來(lái)標(biāo)記該數(shù)值是否為負(fù)數(shù)
if(x < 0) {
x = Math.abs(x);
negative = true;
}//如果是負(fù)數(shù)變成正數(shù)并進(jìn)行標(biāo)記
StringBuilder sb = new StringBuilder();
while(x > 0) {
sb.append(x % 10);
x /= 10;
}
long result = 0;
String sresult = sb.toString();
for(int i = 0; i < sresult.length(); i++) {
result = result * 10 + sresult.charAt(i) - '0';
}//整數(shù)的翻轉(zhuǎn),為了不溢出祝拯,用long類型來(lái)進(jìn)行存儲(chǔ)
if(negative) {
result = - result;
return result < Integer.MIN_VALUE ? 0 : (int)result;
}else {
return result > Integer.MAX_VALUE ? 0 : (int)result;
}//返回前判斷是否溢出
}
}
官方題解
思路
- 翻轉(zhuǎn)數(shù)字的思路其實(shí)就是每次通過(guò)取余操作甚带,獲得最低位,然后再把最低位*10變成我們需要的高位
- 邏輯如下:
//pop operation:
pop = x % 10;
x /= 10;
//push operation:
temp = rev * 10 + pop;
rev = temp;
- 那如何避免溢出這種情況呢佳头?題目中要求如果溢出則返回0鹰贵,官方提供的思路是,每次操作時(shí)康嘉,都要檢查下一次得到的rev是否會(huì)溢出碉输。
- 檢查的思路如下所示:
為什么pop>7就會(huì)溢出呢,是因?yàn)镮NTMAX的值是2147483647
而(INTMAX/10)10=2147483640亭珍,所以如果pop>7敷钾,則超過(guò)了INTMAX這時(shí)候就會(huì)發(fā)生溢出枝哄。
同理,(INTMIN/10)10=-2147483640闰非,如果pop<-8膘格,則會(huì)發(fā)生溢出。
代碼
class Solution {
public int reverse(int x) {
int rev = 0;
while(x != 0) {
int pop = x%10;
x/=10;
if(rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE/10 && pop > 7)) return 0;
if(rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE/10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
}
9. 回文數(shù)
題目
判斷一個(gè)整數(shù)是否是回文數(shù)财松”窦回文數(shù)是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數(shù)。
示例 1:
輸入: 121
輸出: true
示例 2:
輸入: -121
輸出: false
解釋: 從左向右讀, 為 -121 辆毡。 從右向左讀, 為 121- 菜秦。因此它不是一個(gè)回文數(shù)。
示例 3:
輸入: 10
輸出: false
解釋: 從右向左讀, 為 01 舶掖。因此它不是一個(gè)回文數(shù)球昨。
注意點(diǎn)
- 判斷回文數(shù)并不難,但是考察點(diǎn)是如何提高效率眨攘,能夠用比較更少的數(shù)字來(lái)得到結(jié)果
我的寫法
class Solution {
public boolean isPalindrome(int x) {
String s = String.valueOf(x);
int i = 0, j = s.length() - 1;
while(i < j) {
if(s.charAt(i) != s.charAt(j)) {//兩個(gè)指針?lè)謩e從頭和尾來(lái)比較主慰,看是否相等
return false;
}
i++, j--;
}
return true;
}
}
官方題解
思路
- 先對(duì)輸入的數(shù)進(jìn)行判斷,如果是負(fù)數(shù)或者最后一個(gè)數(shù)字是0鲫售,則一定不是回文數(shù)共螺。其次只需要翻轉(zhuǎn)一半的數(shù)字,再比較這兩個(gè)數(shù)字是否一樣情竹,則可以判斷是否為回文數(shù)藐不。這里需要注意的是,如果數(shù)字的位數(shù)是奇數(shù)秦效,則表示著回文中間的那位被復(fù)用了雏蛮,需要再/10來(lái)進(jìn)行比較。
代碼
class Solution {
public boolean isPalindrome(int x) {
if(x<0 || (x%10 == 0 && x != 0)) {
return false;
}
int rev = 0;
while(x > rev) {
rev = rev * 10 + x % 10;
x /= 10;
}
return x == rev || x == rev/10;
}
}