程式設計之美2 數字中的技巧

2021-06-17 20:50:47 字數 1198 閱讀 2847

1、求2進製中1的個數

解法一:利用位操作,原數與它減一的結果相與,得到的結果為將最後乙個1置為0,由此類推。

解法二:查表法,0~256每個數的結果儲存在表裡,這種方法是一種用空間換時間的做法,適合於頻繁呼叫演算法的應用中。

2、與階乘有關

問題一: 給定乙個整數n,求n!中有多少個0

方法一:0與5有關,因此只要判斷n個數中有多少個5的指數即可。while(i%5)

方法二:根據公式,z =  [n/5] + [n/5^2] + [n/ 5^3] + ...,while(n), array[i+1] > array[k],只需要儲存每個點的最長遞增子串行即可,時間複雜度o(n^2)

解法二:基於解法一的優化,採用乙個陣列記錄某個長度的遞增子串行的最大值的最小值,可以減少每次比較次數,但是時間複雜度仍為o(n^2)

解法三:由於記錄遞增子串行中,如果i

17、陣列迴圈移位

見之前的部落格

18、陣列分割,將乙個無序的2n陣列分割成元素個數為n的兩個陣列,並且使得兩個陣列的和最接近。

解法一:排序,將其按照序列位置奇偶分成兩個集合s1、s2,從s1、s2中找兩個數交換,使得s1、s2的差值最小。缺點:無法找到最優解

解法二:考慮到整體和可能大於sum/2或者小於sum/2或者等於,則考慮小於sum/2的情況,假設總共需要2n步完成,第k步計算前k個元素中,任意i個元素總共能有多少種和的取值,假設取值集合為sk-1 = ,則sk = sk-1 並上 {vi+arr[k]}。由於插入的次數至多是o(2^n)

解法三:使用動態劃歸方法,給定乙個陣列arr[i][v]表示是否可以找到i個數,和為v,複雜度為o(n^2 *sum)

19、給定乙個源區間,和任意n個無序區間,判斷源區間是不是在目標區間內

解法一:將所有區間對映到座標軸上,由此的複雜度為o

(n^2

)解法二:先將所有區間按照x

軸排序,再進行一次合併,最後使用二分查詢,看源區間是否被某一不相交區間包含,如果包含,則說明在。排序時間複雜度為o

(n*logn

),合併時間複雜度為o

(n),單次查詢時間複雜都為logn

,總的時間為o

(n*logn+k*logn

程式設計之美 1 12 nim 2

參考 有若干堆石頭,a,b分布依次取,一次只能選擇一堆,從這堆中選擇大於0的石頭,問 1,如果最後取光石頭的人獲勝,a在什麼情況下獲勝?2,如果最後取光石頭的人失敗,a在什麼情況下獲勝?1.在規則1下,先手獲勝的情況,在規則2下先手同樣獲勝 2.規則1和規則2的取法不一樣。設當石頭出現 1,1,1,...

程式設計之美4 1 擴充套件問題2

對於上述位址中的不同意見 例如q n 1 n n 1 n n 2 因為但金剛坐在n 1 個登機客人的位置時,n 1個登機客人不坐在x客人位置,還有 1,n 1,n 2 n個登機客人位置可選擇,n n 1個位置,所以x客人可以坐在自己位置的概率 n n 1 n n 2 q n 2 推道類似 q n 1...

2015 程式設計之美 2月29日

給定兩個日期,計算這兩個日期之間有多少個2月29日 包括起始日期 1.年份能被4整除但不能被100整除 2.年份能被400整除 第一行為乙個整數t,表示資料組數。之後每組資料報含兩行。每一行格式為 month day,year 表示乙個日期。month為中的乙個字串。day與year為兩個數字。資料...