第一題:計算二進制數兩個1之間的間距
- 題目:
個人思路
- 英文翻譯過來就是把數字化成二進制,計算兩個1之間的最大間距。1000,1100,1010的最大間距分別是0,1,2.以此類推
- 個人第一反應是大學數字邏輯課上的一個知識點,十進制轉化爲二進制——短除法!
- 也就是說,在接收到輸入的十進制數以後,利用短除法,轉化爲二進制數。轉化的過程進行間距的計算
- 雖然短除法先計算出來的是二進制低位的數,可是1010的間距從左往右數和從右往左數,結果是等價的
- 實現以下:
func BiggestGap(n int) int {
distance,temp := 0,0
bValue := 0
for n,bValue = bDiv(n);bValue==0; {
n,bValue = bDiv(n)
}
for (n>0) {
n,bValue = bDiv(n)
temp+=1
if bValue==1 {
if temp>distance {
distance=temp
}
temp = 0
}
}
return distance
}
func bDiv(n int)(remainder,bValue int){
if n%2 == 0 {
return n/2,0
}else {
return (n-1)/2,1
}
}
別人的思路
- 看完題目,確定是得本身先琢磨。琢磨完了,得學習學習別人是怎麼分析的。先貼上別人的實現,源碼是C++,我翻譯成golang版本了
- 別人家的版本:
func BinaryDistance(n uint) int {
var i uint
distance,last:=0,-1
for i=0;i<32;i++{
if (n >> i) & 1 !=0 {
if last>=0 {
distance = max(distance,int(i)-last)
}
last = int(i)
}
}
return distance
}
func max(numbers ...int) int{
max := 0
for _,num := range numbers{
if num>max {
max=num
}
}
return max
}
- 這個思路的關鍵點是 xxxxx0 & 000001的結果恆爲零,xxxxx1 & 000001的結果恆爲1(x的意思是爲0或1)。
- 有了這個計算基礎以後,加上int類型默認是32位,藉助移位運算符 >>,就可以判斷二進制數的每一位是0仍是1了
- 最後這部分就沒什麼難度了,不斷計算相鄰兩個1的距離,比以前保存的最大間距大,更新,小,丟棄,調整位置繼續計算