學習思考之《程式設計之美》

2022-01-31 13:28:18 字數 3497 閱讀 8472

二、求二進位制數中1的個數(對於乙個位元組(8bit)的變數,求其二進位制中"1"的個數,要求演算法的執行效率盡可能高)

public

class

one

/*解法一:對於2進製來說,把他除以2就是向左移了一位,餘數為0,代表最後一位為0。餘數為1,代表最後一位為1

*/public

static

int count(int

v)

v = v / 2;

}return

count;

}/*解法二:使用位操作,每次向右移動1位,即拋棄一位。跟00000001進行與運算判斷是否為1

*/public

static

int count2(int

v)

return

count;

}/*解法三:前面兩種解法的時間複雜度都是o(log2n),通過二進位制數每次和(二進位制-1)進行與執行,都會使二進位制中少了乙個1

*/public

static

int count3(int

v)

return

count;

}/*拓展題:給定兩個正整數(二進位制表示的a和b),請問把a變成b需要改變多少位?也就是說a和b的二進位制表示中有多少位是不同的

* 原理:

* 1. a & b,得到的結果c中的1的位表明了a和b中相同的位都是1的位;

* 2. a | b, 得到的結果d中的1的位表明了a和b在該位至少有乙個為1的位,包含了a 與 b 都是1的位數,經過前兩步的位運算,,c 中1的位表明了a 和 b在該位都是1,d中為0的位表明了a 和 b 在該位都是0 ,所以進行第三步。

* 3. c ^ d,e 中為1的位表明了a 和 b不同的位。

* */public

static

int diff(int a,int

b)}

2017.09.01

三、1、給定乙個整數n,那麼n的階乘n!末尾有幾個0呢?

2、求n!的二進位制表示中最低位1的位置

public

class

two/*

問題一的解法一

* 解答思路:n!=k*10^m(m>=0),那麼m的個數就是末尾0的個數。

* n!=2^x * 3^y * 5^z * 7^n…… 不可否認任何乙個數都可以這樣分解開來,其中這個因式分解中

* 2^x * 5^z 能夠組成多少10^m的數,取決於min(x,z)。想想就知道被2整除的頻率比被5整除的頻

* 率高多了,所以只要計算n!因式分解中5的指數。

* */

public

static integer count(final

intn)

}return

sum;

}/*問題一的解法二

*解題思路:z=n/5 + n/5^2 + n/5^3……(不用擔心這會是乙個無窮的運算,因為總存在乙個k,使得5^k>n,則 n/5^k=0)

* 公式中,n/5表示不大於n的數中5的倍數貢獻乙個5,n/5^2 表示不大於n的數中5^2的倍數再貢獻乙個5.

** 上面是《程式設計之美》的解釋?反正我沒看懂,下面說一下個人見解:

* 比如 乙個數 26 那麼 26 / 5= 5 表示26的階乘裡面有 5 10 15 20 25 五個數可以貢獻 5

* 26 / 25=1 表示25的階乘裡面有 25 可以貢獻 5 ,所以25 又貢獻了一次

* */public

static integer count2(int

n)

return

sum;

}/*問題二的解法

* 這麼理解:二進位制除以2相當於向左移了乙個小數點(參照10進製除以10),餘數為0表示可以被除斷,

* 為1表示有餘數不能被除斷。所以 求n!的二進位制表示中最低位1的位置,就可以求最低位1

* 後面有幾個零,把他加1 就可以了。

* 而 1 後面有幾個零,取決於n!中2的個數,因為每存在乙個2,則在數的最低位多1個0

* */public

static integer count3(int

n)

return sum+1;}}

2017.09.01

public

class

three

/** 解題思路:原理:如果每次刪除兩個不同的id(不管是否包含「水王」的id),那麼,在剩下的id列表中,「水王」id出現的次數

* 仍然超過次數的一半。

** 這裡的解題思路是先把tangos陣列中的第乙個假設成「水王」tango,如果tangos第二個與第乙個不一樣,

* 就不管這兩個了,然後把第三個再假設成「水王」,如果第四個id和第三個一樣,那麼ntiames就變成了2,

* 也就是說,陣列後面至少要有兩個與現在假設的id不一樣,才會引起tango的重新賦值,而這樣一直到最少,

* 剩下的就是那個「水王」了。

** 當然,你也可以對陣列排序,那麼n/2 位置的就一定是「水王」了(因為"水王"出現的次數超過了總數的一半)

* */public

static

tango find(tango tangos)

else

else}}

return

tango;

}/*擴充套件題:隨著tango的發展,管理員發現,「超級水王」沒有了。統計結果說明,有三個發帖很多的id,他們的發帖數目

* 都超過了帖子宗數目的n的1/4。你能從發帖id列表中快速找出他們的id嗎?

* */public

static

tango find2(tango tangos)

else

if (num2==0 && tangos[i]!=tango && tangos[i]!=tango2)

else

if (num3==0 && tangos[i]!=tango1 && tangos[i]!=tango2)

else

if (tangos[i]!=tango && tangos[i]!=tango1 && tangos[i]!=tango2)

else

if (tangos[i]==tango)

else

if (tangos[i]==tango1)

else

if (tangos[i]==tango2)

}tango result=;

return

result;}}

2017.09.05

學習思考之《程式設計之美》

二 求二進位制數中1的個數 對於乙個位元組 8bit 的變數,求其二進位制中 1 的個數,要求演算法的執行效率盡可能高 public class one 解法一 對於2進製來說,把他除以2就是向左移了一位,餘數為0,代表最後一位為0。餘數為1,代表最後一位為1 public static int c...

程式設計之美之將帥問題學習筆記

讓我恍然大悟的鏈結 所以這裡mark一記 這裡的取模運算到底是個什麼意思?黑人問號 通常情況下來說,我用到取模運算的地方就是負載均衡的時候,通過乙個獨立的uuid進行取模,然後分配到指定的伺服器上,例如我的uuid 1,小明的uuid 8,但是我只有兩組伺服器,如何保證我每次進來的時候分配的伺服器是...

《程式設計之美》背後的作者之美

中文站總編輯 霍泰穩收到 程式設計之美 這本書的時候,我是悲喜交集的。喜的是可以從中了解一下微軟是如何做面試的,和其他的軟體公司有什麼區別,這可能是我長期從事編輯的毛病,遇事總愛比較一番 悲的是我發現上面的絕大多數面試題目我都看不懂,更悲的是我還是乙個計算機科班出身的人,看來今後再也不能隨便給別人吹...