二、求二進位制數中1的個數(對於乙個位元組(8bit)的變數,求其二進位制中"1"的個數,要求演算法的執行效率盡可能高)
public2017.09.01class
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)}
三、1、給定乙個整數n,那麼n的階乘n!末尾有幾個0呢?
2、求n!的二進位制表示中最低位1的位置
public2017.09.01class
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;}}
public2017.09.05class
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;}}
學習思考之《程式設計之美》
二 求二進位制數中1的個數 對於乙個位元組 8bit 的變數,求其二進位制中 1 的個數,要求演算法的執行效率盡可能高 public class one 解法一 對於2進製來說,把他除以2就是向左移了一位,餘數為0,代表最後一位為0。餘數為1,代表最後一位為1 public static int c...
程式設計之美之將帥問題學習筆記
讓我恍然大悟的鏈結 所以這裡mark一記 這裡的取模運算到底是個什麼意思?黑人問號 通常情況下來說,我用到取模運算的地方就是負載均衡的時候,通過乙個獨立的uuid進行取模,然後分配到指定的伺服器上,例如我的uuid 1,小明的uuid 8,但是我只有兩組伺服器,如何保證我每次進來的時候分配的伺服器是...
《程式設計之美》背後的作者之美
中文站總編輯 霍泰穩收到 程式設計之美 這本書的時候,我是悲喜交集的。喜的是可以從中了解一下微軟是如何做面試的,和其他的軟體公司有什麼區別,這可能是我長期從事編輯的毛病,遇事總愛比較一番 悲的是我發現上面的絕大多數面試題目我都看不懂,更悲的是我還是乙個計算機科班出身的人,看來今後再也不能隨便給別人吹...