Java位運(yùn)算算法題-00

二進(jìn)制中 1 的個(gè)數(shù)

輸入一個(gè)整數(shù),輸出該數(shù)二進(jìn)制表示中 1 的個(gè)數(shù)。

  • 知道就知道,不知道沒辦法。
  • 題解原話,有一個(gè)性質(zhì):n&(n?1),會(huì)將n的二進(jìn)制中最低位由1變成0
public int NumberOf1(int n) {
    int cnt = 0;
    while (n != 0) {
        cnt++;
        n &= (n - 1);
    }
    return cnt;
}

https://github.com/CyC2018/CS-Notes/blob/master/notes/15.%20%E4%BA%8C%E8%BF%9B%E5%88%B6%E4%B8%AD%201%20%E7%9A%84%E4%B8%AA%E6%95%B0.md


數(shù)組中只出現(xiàn)一次的數(shù)字

一個(gè)整型數(shù)組里除了兩個(gè)數(shù)字之外,其他的數(shù)字都出現(xiàn)了兩次,找出這兩個(gè)數(shù)。

  1. hash表
import java.util.*;
public class Solution {
    public int[] FindNumsAppearOnce (int[] array) {
        HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>(); 
        ArrayList<Integer> res = new ArrayList<Integer>();
        //遍歷數(shù)組
        for(int i = 0; i < array.length; i++) 
            //統(tǒng)計(jì)每個(gè)數(shù)出現(xiàn)的頻率
            if(!mp.containsKey(array[i]))
                mp.put(array[i], 1);
            else
                mp.put(array[i], mp.get(array[i]) + 1);
        //再次遍歷數(shù)組
        for(int i = 0; i < array.length; i++) 
            //找到頻率為1的兩個(gè)數(shù)
            if(mp.get(array[i]) == 1) 
                res.add(array[i]);
        //整理次序
        if(res.get(0) < res.get(1)) 
            return new int[] {res.get(0), res.get(1)};
        else
            return new int[] {res.get(1), res.get(0)};
    }
}

https://www.nowcoder.com/practice/389fc1c3d3be4479a154f63f495abff8?tpId=13&tqId=11193&tab=answerKey&from=cyc_github

  1. 異或
  • 個(gè)人不喜歡這個(gè)方法,感覺很難從邏輯上考慮到這層關(guān)系。除非為了用位運(yùn)算而去用位運(yùn)算。
  • 兩個(gè)相等的元素異或的結(jié)果為 0,而 0 與任意數(shù) x 異或的結(jié)果都為 x。
  • x^x^y^y^z^k = z^k。
  • diff = diff & -diff 得到 diff 位級(jí)表示中最右側(cè)為 1 的位,用于區(qū)分兩個(gè)元素。
public int[] FindNumsAppearOnce (int[] nums) {
    int[] res = new int[2];
    int diff = 0;
    for (int num : nums)
        diff ^= num;
    diff &= -diff;
    for (int num : nums) {
        if ((num & diff) == 0)
            res[0] ^= num;
        else
            res[1] ^= num;
    }
    if (res[0] > res[1]) {
        swap(res);
    }
    return res;
}
private void swap(int[] nums) {
    int t = nums[0];
    nums[0] = nums[1];
    nums[1] = t;
}

https://github.com/CyC2018/CS-Notes/blob/master/notes/56.%20%E6%95%B0%E7%BB%84%E4%B8%AD%E5%8F%AA%E5%87%BA%E7%8E%B0%E4%B8%80%E6%AC%A1%E7%9A%84%E6%95%B0%E5%AD%97.md


引用倉庫:https://github.com/CyC2018/CS-Notes/blob/master/notes/%E5%89%91%E6%8C%87%20Offer%20%E9%A2%98%E8%A7%A3%20-%20%E7%9B%AE%E5%BD%95.md

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 斐波那契數(shù)列 求斐波那契數(shù)列的第 n 項(xiàng),n <= 39。 我對(duì)動(dòng)態(tài)規(guī)劃的理解是,一個(gè)問題的答案可以通過直接得出的...
    檸檬樹LeTr閱讀 413評(píng)論 0 0
  • 矩陣中的路徑 判斷在一個(gè)矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一個(gè)格子開始,每一步可...
    檸檬樹LeTr閱讀 324評(píng)論 0 0
  • 數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)字 給一個(gè)長度為 n 的數(shù)組,數(shù)組中有一個(gè)數(shù)字出現(xiàn)的次數(shù)超過數(shù)組長度的一半,請(qǐng)找出這個(gè)數(shù)...
    檸檬樹LeTr閱讀 494評(píng)論 0 1
  • 從尾到頭打印鏈表 從尾到頭反過來打印出每個(gè)結(jié)點(diǎn)的值。 感覺更優(yōu)-遞歸打123的逆序,先打23逆序再打1,先打3逆序...
    檸檬樹LeTr閱讀 408評(píng)論 0 0
  • 調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)前面 輸入一個(gè)長度為 n 整數(shù)數(shù)組,實(shí)現(xiàn)一個(gè)函數(shù)來調(diào)整該數(shù)組中數(shù)字的順序,使得所有的奇數(shù)...
    檸檬樹LeTr閱讀 196評(píng)論 0 0

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