阿里筆試模擬題 68 一的個數

2021-10-22 12:52:05 字數 1024 閱讀 8597

概述:

給你兩個數字l、r,問在區間[l,r]內的所有數中,二進位制表示下「1」的個數最多的乙個數是多少,如果有多個相同的,輸出所有符合條件的數中最小的乙個數。

輸入乙個整數l,和乙個整數r。(1<=l<=r<=10^9)

輸出乙個數字表示[l,r]內二進位制下「1」的個數最多的數。如果有多個,輸出符合條件的數中最小的。

示例1輸入:510

輸出:7

題目位址

68.一的個數

這邊我解釋一下我的解題思路。就是乙個二進位制數(000101…),在某乙個位置新增1對於1的個數來說影響是一樣的,但是如果在右邊新增1此時整個二進位制的數比較小。因此,基於這個原理很多是,不斷讓右邊的位置都填滿1。而左邊的位置(即高位)必須得滿足一定規則,否則數會超過[l,r]的範圍。

因此我這邊把 r 和 l 進行乙個位異或操作,在把位異或得出來的數傳進去gethighestposition的函式中,這樣能獲取到 r 跟 l 二進位制位置從左到右第乙個不相同的位置。gethighestposition返回的是乙個數字,表示這個1從右到左排第幾位。把這個位置作為乙個標誌,左邊為高位,右邊為低位。高位必須相同,因為如果在高位中只要新增乙個1,那麼數肯定超過[l,r]的範圍。那麼高位不變,我們只要盡量讓低位的位置全部排滿1即可(前提是滿足 [l,r]的範圍)。

heighnum 表示的是高位跟 r , l 一樣,但是低位全是0的乙個數字,可以揣摩一下 (r | (top-1)) - (top-1)是計算什麼出來的。高位得到後,我就讓heighnum 加上乙個低位全是1的數,最後這個和即為[l,r]中最多1且最小的數。

public int solution(int l, int r) 

return heighnum+below-1;

}public int gethighestposition(int num)

return res;

}

阿里筆試模擬題 37 最強的團隊

概述 有乙個陣營,裡面有n個小隊 1 n 100 每個小隊都有他們的能力值ai 0 i現在有乙個緊急情況,需要從這些小隊中選出連續的幾個小隊,組成乙個最強的團隊。最強的團隊的定義為這個團隊的所有小隊的平均能力值最高。如果有多個最強團隊,則選包含小隊最多的乙個。現在請你寫個程式,輸出這個最強的團隊包含...

演算法筆試模擬題精解之「一的個數」

前言 給你兩個數字l r,問在區間 l,r 內的所有數中,二進位制表示下 1 的個數最多的乙個數是多少,如果有多個相同的,輸出所有符合條件的數中最小的乙個數。輸入乙個整數l,和乙個整數r。1 l r 10 9 輸出乙個數字表示 l,r 內二進位制下 1 的個數最多的數。如果有多個,輸出符合條件的數中...

阿里筆試第一題

問答題1 輸出結果 21.25 7.50 30.00 2.50 從左到右依次為執行時間 單位是ms 此sql語句的分類,sql語句 2.5 0 insert into tablea values 1,columna columnb 12.5 1 insert into tableb values 2...