題目描述java
給出一個 32 位的有符號整數,你須要將這個整數中每位上的數字進行反轉。git
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:
假設咱們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−2^31, 2^31 − 1]。請根據這個假設,若是反轉後整數溢出那麼就返回 0。
複製代碼
題意理解bash
傳入一個32位的有符號整數,返回它倒置之後的數。前面的0不須要返回,若倒置後超出32位範圍則返回0.函數
思路ui
這題解法較多。spa
1.轉換成字符串處理code
剛看完題目個人第一想法是把整數轉成StringBuilder後直接用reverse方法反轉,而後再轉成int類型返回,要注意傳入負數時要在最後加上負號。字符串
2.在線處理字符串處理
這個方法是在評論區看到的,應該是這個問題的最優解。思路主要是用一個整數從後往前獲取x的每一位值,用另外一個整數記錄每次過程的中間值。每次判斷中間值整除10與前一次的中間值是否相同,若不一樣則說明溢出。string
ACCode
class Solution {
public int reverse(int x) {
int flag = x < 0? -1 : 1;
String xx = String.valueOf(Math.abs(x));
String r = new StringBuilder(xx).reverse().toString();
try{
int result = flag * Integer.parseInt(r);
return result;
}catch(Exception e){
return 0;
}
}
}
複製代碼
class Solution {
public int reverse(int x) {
/** ret 保存舊的翻轉中間值, temp 保存新的翻轉過程當中間值 依次提取 x 的末位加入 temp, 若是發生溢出則經過temp/10 沒法獲得上一輪的翻轉結果 ret **/
int ret = 0;
while(x != 0) {
int temp = ret*10 + x%10;
if(temp / 10 != ret)
return 0;
ret = temp;
x /= 10;
}
return ret;
}
}
複製代碼
題目描述
請你來實現一個 atoi 函數,使其能將字符串轉換成整數。
首先,該函數會根據須要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符爲止。
當咱們尋找到的第一個非空字符爲正或者負號時,則將該符號與以後面儘量多的連續數字組合起來,做爲該整數的正負號;假如第一個非空字符是數字,則直接將其與以後連續的數字字符組合起來,造成整數。
該字符串除了有效的整數部分以後也可能會存在多餘的字符,這些字符能夠被忽略,它們對於函數不該該形成影響。
注意:假如該字符串中的第一個非空格字符不是一個有效整數字符、字符串爲空或字符串僅包含空白字符時,則你的函數不須要進行轉換。
在任何狀況下,若函數不能進行有效的轉換時,請返回 0。
說明:
假設咱們的環境只能存儲 32 位大小的有符號整數,那麼其數值範圍爲 [−2^31, 2^31 − 1]。若是數值超過這個範圍,返回 INT_MAX (2^31 − 1) 或 INT_MIN (−2^31) 。
示例 1:
輸入: "42"
輸出: 42
示例 2:
輸入: " -42"
輸出: -42
解釋: 第一個非空白字符爲 '-', 它是一個負號。
咱們儘量將負號與後面全部連續出現的數字組合起來,最後獲得 -42 。
示例 3:
輸入: "4193 with words"
輸出: 4193
解釋: 轉換截止於數字 '3' ,由於它的下一個字符不爲數字。
示例 4:
輸入: "words and 987"
輸出: 0
解釋: 第一個非空字符是 'w', 但它不是數字或正、負號。
所以沒法執行有效的轉換。
示例 5:
輸入: "-91283472332"
輸出: -2147483648
解釋: 數字 "-91283472332" 超過 32 位有符號整數範圍。
所以返回 INT_MIN (−2^31) 。
複製代碼
題意理解
本題要求實現atoi方法,傳入一個字符串從第一個非空格字符開始提取出連續的整數包括負數,取出的整數需在規定範圍內。須要注意的是「- 123」 返回的應該是0,由於負號後的第一個字符不是數字。還有題目中沒有說起正號開頭的狀況,要注意這種狀況也是合理的。
思路
剛開始想的是逐個字符判斷過去,寫的過程當中產生了大量的if嵌套,致使邏輯混亂。後來發現是個人分類方式有問題,如無論是不是負號開頭後面取出數字的邏輯是相同的。把問題分析清楚,提取出邏輯相同的部分就很簡單了,具體的邏輯看下面的代碼。
ACCode
class Solution {
public int myAtoi(String str) {
int MAX = 0x7fffffff;
int MIN = 0x80000000;
int UP = MAX / 10;
int DOWN = MIN / 10;
str = str.trim();
if(str.isEmpty()) return 0;
int ans = 0;
int sign = 1;
char c = str.charAt(0);
if('+'==c);
else if('-'==c)sign = -1;
else if(Character.isDigit(c))ans = c-'0';
else return 0;
for(int i=1; i<str.length(); ++i){
c = str.charAt(i);
if(!Character.isDigit(c))break;
int n = c-'0';
//判斷目前的值(ans)在加入下一個數字後會不會超過INT_MAX,
if(ans>UP||(ans==UP&&n>7)){ans=MAX;break;}
//同理,判斷負數加入下一個數字會不會超過INT_MIN
if(ans<DOWN||(ans==DOWN&&n>8)){ans=MIN;break;}
ans = ans*10 + sign*n;
}
return ans;
}
}
複製代碼
題目描述
判斷一個整數是不是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是同樣的整數。
示例 1:
輸入: 121
輸出: true
示例 2:
輸入: -121
輸出: false
解釋: 從左向右讀, 爲 -121 。 從右向左讀, 爲 121- 。所以它不是一個迴文數。
示例 3:
輸入: 10
輸出: false
解釋: 從右向左讀, 爲 01 。所以它不是一個迴文數。
複製代碼
進階:
你能不將整數轉爲字符串來解決這個問題嗎?
題目理解
本題題意較簡單,判斷傳入的數倒置之後是否和原來同樣便可。
思路
若是轉成字符串能夠直接兩行搞定,可是時間複雜度太大。
這裏就簡單地求出反轉後的數字與原來的整數比較便可。
ACCode
class Solution {
public boolean isPalindrome(int x) {
if (x < 0) return false;
int y = 0, dit = 0;
int temp = x;
while (temp != 0) {
dit = temp % 10;
y = y * 10 + dit;
temp /= 10;
}
return x == y;
}
}
複製代碼