程式設計之美總結

2021-06-23 09:58:53 字數 2291 閱讀 7427

2.1.求二進位制中1的個數

除數取餘     v & (v - 1)

2.2.不要被階乘嚇倒:求n!中末尾有多少個0

n! = 2^a*3^b*5^c*7^d*11^e*....

然後n!中能被x整除的數為[n/x]

由此可知:能被5整數的個數就是[n / 5] + [n / (5^2)] + [n / (5^3)]+...

2.3.尋找發帖「水王」:「水王」發帖數超過總帖數的一半,找出這個」水王「的id

思想:先排序,然後找出超過一般的id;先排序,然後在[n/2]項就是這個id;每次刪除兩個不同的id,最後乙個肯定是這個水王的id

int main()

; int ntimers = 0;

int candi;

for(int i = 0; i < 10; ++i)

else

}cout<

2.4. 1的個數,給定乙個n,求出1~n個數中有多少個1.

思想:從1開始遍歷求出每個數的1的個數,然後計算總和;找規律,逐個求每位數中1出現的個數,然後求和

int sumls(int n)

ifactor *= 10;

} return icount;

}

根據上面的式子求出sumls(n) = n的最大的n,由

sumls(9) = 1;

sumls(99) = 20;

sumls(999) = 300;

sumls(9999) = 4000;

存在乙個公式sumls(10^n - 1) = n* 10^(n -1);

當n = 11時候

2.5尋找最大的k個數

利用堆排序,先建立小根堆,然後再逐個與對頂比較;如果數都為整數還是有限的,則利用陣列存放所有的數的次數。

2.6.給定乙個有限小數或無限迴圈小數,將其轉換成分數,精確表達出來。

思想:如果為不迴圈小數,可以直接將其乘以10^n擴大成整數,然後將其數與10^n去掉公約數即可

如果為無限迴圈小數,則將迴圈部分變成小數,不迴圈部分變成整數。如果迴圈的位數為n,則與10^n - 1一起去掉公約數即可。最大公約數的求法見下一題

2.7.求兩個數的最大公約數

輾轉相除法:f(x,y) = f(y,x%y)(x>=y>0)直到y = 0時候,則另外乙個數就是他們的最大公約數

但是要知道,除法比移位開銷大,而取模用到了除法

可將其轉換成f(x,y) = f(y,x - y)(x>=y>0)直到y= 0時,另乙個為最大公約數(減少了開銷,但是迭代次數比較多)

最佳方法:

將兩個數變成二進位制數,然判斷兩個是否為偶數,有的話提取公共因子,沒有的話,如果乙個奇數

f(42,30) = f(101010,1110) = 2*f(10101,1111) = 2*f(1111,110) = 2*f(1111,11) = 2*f(1100,11) = 2f(11,11) = 2*f(00,11)=2*11 = 6

2.8找符合條件的整數:給定乙個最小的正整數n,求乙個最小的正整數m,是的n*m的十進位制表示形式裡只含有1和0

思路:首先給出n,然後從0,1,10,11這樣逐個與n相處,能整數的則為最小的正整數

最佳思路:還未看懂。。。

2.9.斐波拉切數列

老題目不談了~

2.10.尋找乙個陣列的最大值和最小值

為了減少比較次數,則使用陣列中0和1比較,然後將最大的與max比較,最小的與min比較,則兩個數比較3次,n個數比較1.5n次

2.11.在乙個平面上n個點的座標,找出距離最近的兩個點

這個沒看懂,以後解決。

2.12.給定乙個陣列,快速找出兩個數使得它們的和為n

思路:hash表,先將陣列中的值hash入陣列,然後逐個看n-a[i]的值在hash表中是否存在;

首先排序,然後i = 0,j = n - 1,如果a[i] + a[j] =n則退出,如果小於n,則i遞增,如果大於n,j遞減,如此迴圈

2.13.給定乙個個數為n的整數陣列,找出任意n-1個數使得乘積最大。

見本人有個帖子轉換說明

2.14.求陣列的子陣列的最大值,給定乙個陣列,求出連續n個數他們之和為最大值

思路:設定乙個數存放歷史最大值,乙個數存放當前的最大值

逐個訪問,如果當前最大值為負數,則重置為0,如果非負數,則與歷史最大值比較,如果大,則改變歷史最大值

int maxvalue(int *a,int size)

return max;

}

2.15.

推薦《程式設計之美》

推薦 程式設計之美 我很早知道鄒欣計畫要寫這樣一本書,也能夠預計到這本書定會廣受歡迎,因為它符合當前大量求職人員的需求,畢竟於他們而言,誰不想知道微軟亞洲研究院在招人時候問些什麼問題呢。另一方面,把考察軟體技術人員專業知識和相應技能的各種手段加以歸納和整理,這本身也是對業界的貢獻,所以,我相信,一旦...

程式設計之美摘錄

第1章 遊戲之樂 遊戲中碰到的題目 1.1讓cpu佔用率曲線聽你的指揮 int main return 0 解法二 使用gettickcount 和sleep 解法三 能動態適應的解法 1.2中國象棋將帥問題 1.3一摞烙餅的排序 1.4買書問題 1.5快速找出故障機器 1.6飲料供貨 1.7光影切...

程式設計之美 2 2

1 階乘確實是乙個讓人頭疼的問題,其本身的實現很簡單,它的問題在於結果膨脹式的增長會造成n!的結果的溢位。2.2給出了幾種從數學角度出來的思路,可以避免上面的問題發生。首先要清楚的乙個問題就是質因數分解 給定任意乙個整數w,那麼w一定可以分解成w 2 x 3 y 5 m 這種形式,這個數學理論是解決...