反轉(zhuǎn)類題目【LeetCode:7/190】

題目

7:整數(shù)反轉(zhuǎn)

給出一個 32 位的有符號整數(shù),你需要將這個整數(shù)中每位上的數(shù)字進(jìn)行反轉(zhuǎn)。

190:顛倒二進(jìn)制位

顛倒給定的 32 位無符號整數(shù)的二進(jìn)制位。

解析

7:整數(shù)反轉(zhuǎn)

這道題其實很容易想到的思路就是講 數(shù)字轉(zhuǎn)為字符串,接著逆反字符串,最后轉(zhuǎn)回數(shù)字即可,實際上我也是這樣實現(xiàn)的。但是通過字符串中轉(zhuǎn)明顯有性能問題,無論我如何優(yōu)化,最后都停留在2ms,無法前進(jìn)??赐旯俜浇馕鲋笠膊琶靼祝梢酝ㄟ^簡單的數(shù)學(xué)運算就可以按十進(jìn)制get和push,唯一需要注意的就是32位存儲溢出的問題。

190:顛倒二進(jìn)制位

有了第7道題的練手,這道題就很容易做了,直接按位取和按位push即可。

實現(xiàn)

7:整數(shù)反轉(zhuǎn)

字符串思路實現(xiàn),有性能問題。

/**
 * 思路:轉(zhuǎn)成字符數(shù)組,逆反之后,再轉(zhuǎn)回數(shù)字
 * 執(zhí)行用時 : 2 ms , 在所有 java 提交中擊敗了 73.04% 的用戶, 內(nèi)存消耗擊敗80%的用戶
 */
int reverse(int x) {
    // 轉(zhuǎn)string
    String str = Integer.toString(x);
    int length = str.length();
    // 簡單情況直接返回
    if (length == 1) {
        return x;
    }
    // 判斷正負(fù)數(shù),設(shè)定遍歷起點位置
    int i = x < 0 ? 1 : 0;
    // 反轉(zhuǎn)字符數(shù)組
    for (int y = 0, l = length - i ; y < l; y++) {
        n[y] = str.charAt(length - y - 1);
    }
    // 判斷是否會溢出32位存儲
    if (length - i == 10) {
        for (int q = 0; q < 10; q++) {
            if (n[q] < number[q]) {
                break;
            } else if (n[q] > number[q]) {
                return 0;
            }
        }
    }
    // 結(jié)果轉(zhuǎn)換并返回
    int result = n[0] - 48;
    for (int p = 1; p < length - i; p++) {
        result = result * 10 + (n[p] - 48);
    }
    return i == 0 ? result : -result;
}

190:顛倒二進(jìn)制位

/**
 * 1ms, 運行速度擊敗100%, 內(nèi)存5.5%
 * @param n 32位輸入
 * @return 顛倒后輸入
 */
int reverseBits(int n) {
    int result = n;
    for (int i = 0; i < 31; i++) {
        result = result << 1;
        n = n >>> 1;
        result = result | n & 1;
    }
    return result;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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