[思路]LeetCode Problems- 461. Hamming Distance

有鑑於上次按隨機鍵出來的題目難度特高,花了不少心思,
並且上週去成大一個禮拜沒碰到程式許久,
我決定這次來解決一些較簡單的題目,
並嘗試不用C++而用C語言來完成

這次練習的題目是Hamming Distance,題目原文如下:


The Hamming distance between two integers is the number of positions at which the corresponding bits are different.
Given two integers x and y, calculate the Hamming distance.
Note:
0 ≤ xy < 231.
Example:
Input: x = 1, y = 4

Output: 2

Explanation:
1   (0 0 0 1)
4   (0 1 0 0)
       ?   ?

The above arrows point to positions where the corresponding bits are different.

漢明距離(Hamming Distance)在通訊領域裡是頗重要的編碼應用,個人最早是在學習通道編碼的Viterbi演算法中碰到的.
在Viterbi演算法中需要透過編碼器的格狀架構找出一條最短路徑,找出擁有「最大可能性」路徑的方法,而這就需要應用到漢明距離.最簡單的解釋就是位元數不同的數目總和
例如:(wiki)
  • 10111011001001之間的漢明距離是2
  • 21438962233796之間的漢明距離是3
跟先前寫過的題目來比,這一題的邏輯脈絡就清楚許多,可分成三個步驟:
1.十進位轉換成二進位
2.轉換後資料存成字串或陣列
3.比對兩個字串或陣列的內容
首先要來處理的就是位制轉換問題,十進位轉換成二進位的方法如下所示:

簡言之 這演算法有兩個重要skill:
1.取得餘數(1或者是0)
2.針對除法所得到的商數繼續做除法
有了這兩個概念後我們就可以用FOR迴圈來實現這個轉換問題
已知輸入的十進位變數是 x , 則
     int k1;
    for (int i=0; i<31; i++){   //重複31次代表二進位元最大個數(題目限制)
        k1 = x % 2;   //使用%運算子取得餘數並更新k1變數
       X1[i]=k1;   //餘數存入陣列中
       x /= 2;    //算術指派運算子,即是把原變數用商取代掉
                      //意思即為  x=x / 2
    }
接著就是要取得轉換後的結果,
我一開始還在想說是要用普通陣列還是要把int數值轉換成字串來儲存,後來發覺就算存成字串也沒有方便的函數比較內容,用strcmp()或是strncmp()也只是找出位置後就停止搜尋,還沒有直接用if條件式來比較的方便:
int X1[31] = {0}; //預設元素都是0的陣列
int Y1[31] = {0};
//轉換完後比對資料
 int count=0; //計數
    for (int l=0;l<31;l++)
    {        
        if (X1[l]!=Y1[l]) //若發覺有不同數值
        {       count++;    //計數+1   }           
    }
最後的count就是Hamming Distance了
寫完後按送出鍵.....一次就成功~!!!









留言

這個網誌中的熱門文章

106年推甄通訊所心得(下)

106年推甄通訊所心得(上)

[心得]"把合理當正確"的謬誤--邏輯謬誤鑑識班 Lesson 1