#LeetCode:476. Number Complement

灆洢 2020-05-04 21:28:40

此題要將整數用二進位表示法列出後,算出從最高位的 1 往最低位去做全部 0 與 1 反轉的結果。

最基本的想法是從二進位的個位數一位一位得出來後,反轉加進一個變數中即可。如果本身語言對數值二進位運算有做優化的話,可以找最高位的 1 在哪裡之後,整個反轉,往前移最高位前面零的個數,再往後移回來並補零即可。

Kotlin – Basic Solution (132ms)

/*******************************************************
 * LeetCode 476. Number Complement                     *
 * Author: Maplewing [at] knightzone.studio            *
 * Version: 2020/05/04                                 *
 *******************************************************/
class Solution {
    fun findComplement(num: Int): Int {
        var remainNumber = num
        var value = 0
        var base = 1
        while (remainNumber > 0) {
            value += base * if (remainNumber % 2 == 0) 1 else 0

            remainNumber /= 2
            base *= 2
        }

        return value
    }
}

Kotlin – Advanced Solution (120ms)

/*******************************************************
 * LeetCode 476. Number Complement                     *
 * Author: Maplewing [at] knightzone.studio            *
 * Version: 2020/05/04                                 *
 *******************************************************/
class Solution {
    fun findComplement(num: Int): Int {
        /* 
            Next line can be changed with 
            experimental standard library API : num.countLeadingZeroBits()
            when it is stable.
        */
        val leadingZeroCount = Integer.numberOfLeadingZeros(num) 
        return num.inv().shl(leadingZeroCount).shr(leadingZeroCount)
    }
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料