LeetCode Practice(一)

第一題:計算二進制數兩個1之間的間距

  • 題目:

    clipboard.png

個人思路

  • 英文翻譯過來就是把數字化成二進制,計算兩個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的距離,比以前保存的最大間距大,更新,小,丟棄,調整位置繼續計算
相關文章
相關標籤/搜索