伊莉討論區
標題:
leetcode 461.hammingDistance
[打印本頁]
作者:
阿次阿
時間:
2017-3-13 05:26 PM
標題:
leetcode 461.hammingDistance
提示:
作者被禁止或刪除 內容自動屏蔽
作者:
CoNsTaRwU
時間:
2017-3-14 06:18 PM
提示:
作者被禁止或刪除 內容自動屏蔽
作者:
阿次阿
時間:
2017-3-15 05:21 PM
提示:
作者被禁止或刪除 內容自動屏蔽
作者:
CoNsTaRwU
時間:
2017-3-16 11:39 PM
提示:
作者被禁止或刪除 內容自動屏蔽
作者:
ren1244
時間:
2017-3-17 12:16 AM
本帖最後由 ren1244 於 2017-3-17 12:20 AM 編輯
先解釋一下問題在哪裡:
當n=31時,「x/(int)pow(2.0,n)」會先計算2[sup]31[/sup]=2147483648。但是對32bit的int而言,所能儲存的最大值是2147483647。把2147483648轉換為最大只能儲存2147483647的int原本就有問題。也就是所謂的溢位了。不同編譯器處理方式可能不一樣。
既然題目已經說x,y都會小於2[sup]31[/sup],那麼所有的x,y用2[sup]31[/sup]做整數除法必然都為0。也就是說我們根本不需要檢查n=31的狀況,從n=30開始檢查即可。
只要把for迴圈的31改成30問題就可以解決了。
(後面是其他補充)
面對這種問題,其實不需要用到pow函數。
如果反向從低位向高位來比對,就可以只用整數方式來處理:
int hammingDistance(int x, int y)
{
int n;
int key=0;
for(n=0;n<31;++n)
{
if(x%2 != y%2)
++key;
x=x/2;
y=y/2;
}
return key;
}
複製代碼
寫到這邊,概念上還停留在十進位整數。
如果可以理解整數是以二進位儲存,並能活用位元運算,下面這段程式碼也是做同樣的事情
(一般來說位元運算的速度比加減乘除快)
int hammingDistance(int x,int y)
{
int k=0;
int t;
for(t=x^y;t;t>>=1)
if(t&1)
++k;
return k;
}
複製代碼
作者:
阿次阿
時間:
2017-3-17 10:03 PM
提示:
作者被禁止或刪除 內容自動屏蔽
作者:
gitlab
時間:
2017-5-4 09:53 PM
其實就是計算 x xor y 的二進位表示法裡面有多少1
提供一個「二進位表示法裡面有多少1」很有名的作法
int a = x ^ y;
int cnt = 0;
while( a ){
cnt += 1;
a &= a-1;
}
return cnt;
歡迎光臨 伊莉討論區 (http://www01.eyny.com/)
Powered by Discuz!