日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算若干数据的汉明距离总和

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算若干数据的汉明距离总和 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

總結

題目

思路

?C++代碼


總結

位運算題目里,把復雜度降為 O(n) 的騷操作基本都是寫一個 32 次(因為int型數據)的 for 循環,恰如好多”僅包含字母“的題目的騷操作都是寫一個 26 次的 for 循環。

題目

477. 漢明距離總和

難度中等168收藏分享切換為英文接收動態反饋

兩個整數的?漢明距離?指的是這兩個數字的二進制數對應位不同的數量。

計算一個數組中,任意兩個數之間漢明距離的總和。

示例:

輸入: 4, 14, 2輸出: 6解釋: 在二進制表示中,4表示為0100,14表示為1110,2表示為0010。(這樣表示是為了體現后四位之間關系) 所以答案為: HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.

注意:

  • 數組中元素的范圍為從?0到?10^9。
  • 數組的長度不超過?10^4。
  • 思路

    位運算題目里,把復雜度降為 O(n) 的騷操作基本都是寫一個 32 次(因為int型數據)的 for 循環,恰如好多”僅包含字母“的題目的騷操作都是寫一個 26 次的 for 循環。

    總結1. 思路是:比如有3個數(用二進制表示) (方向從右到左<-,分別為第1位、第2位...)第一個數 a: 1 0 0 1第二個數 b: 0 1 1 1第三個數 c: 0 0 1 1那么第一位上的漢明距離總和是0。為什么? 因為a、b、c該位全是"1",任意兩個"1"的漢明距離是0,所以該位漢明距離總和是0。接下來看第二位,a的第二位是"0",b、c的是"1",此時該位的漢明距離就是2。為什么? 由上面我們可以得到,該位的"0"有1個,"1"有2個,而任意一個"0"都可以和任意一個"1"組合,一對組合可以產生的漢明距離為1,所以問題轉換為了算多少對01組合,那么怎么計算呢?答案就是該位"0"的個數乘以"1"的個數。接下來看第三位,可以看出,此時"0"有2個,"1"有1個,所以可以產生的漢明距離為2。接下來看第四位,可以看出,此時"0"有2個,"1"有1個,所以可以產生的漢明距離為2。于是: 總的漢明距離就是 0 + 2 + 2 + 2 = 6

    ?C++代碼

    class Solution { public:int totalHammingDistance(vector<int>& nums) {if(nums.empty()) return 0;int res = 0;int len = nums.size();for(int i = 0; i < 30; i++){int oneCount = 0;int temp = 0;for(int j = 0; j < len; j++){oneCount += nums[j] & 1; //統計每一數位上1的個數nums[j] >>= 1; //考慮數的上一位temp += nums[j] == 0 ? 1 : 0; //通過內層循環統計通過右移變為0的數的個數 當所有數都是0后(temp == len),后續就不需要繼續了}res += oneCount * (len - oneCount); //計算每一位的漢明距離if(temp == len) break;}return res;} };

    ?

    總結

    以上是生活随笔為你收集整理的计算若干数据的汉明距离总和的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。