[更新中][已更新2題]騰訊精選練習(xí)50題解題思路記錄

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ù)組不能夠溢出。

我的寫(xiě)法

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)型來(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é)果

我的寫(xiě)法

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容