有很多伙伴跟我說(shuō),每次看完算法的文章,都覺(jué)得自己宛如一個(gè)智障,有木有同感的伙伴?。ㄖ灰枷氩换拢k法總困難多)
創(chuàng)新互聯(lián)建站是一家專業(yè)提供騰沖企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、成都做網(wǎng)站、H5建站、小程序制作等業(yè)務(wù)。10年已為騰沖眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
今天就不寫(xiě)太復(fù)雜的算法知識(shí)了,分享幾道 LeetCode 上一行代碼就能 AC 的算法題??梢猿虺蚰銜?huì)不,哈哈哈?。?!
題目難度為 Easy,目前通過(guò)率為 45.6% 。
題目描述
給定一個(gè)整數(shù),編寫(xiě)一個(gè)函數(shù)來(lái)判斷它是否是 2 的冪次方。
題目解析
如果一個(gè)數(shù)是 2 的次方數(shù)的話,那么它的二進(jìn)數(shù)必然是最高位為1,其它都為 0 ,那么如果此時(shí)我們減 1 的話,則最高位會(huì)降一位,其余為 0 的位現(xiàn)在都為變?yōu)?1,那么我們把兩數(shù)相與,就會(huì)得到 0。
一行代碼實(shí)現(xiàn)
class Solution { public: bool isPowerOfTwo(int n) { return (n > 0) && (!(n & (n - 1))); } };
題目難度為 Easy,目前通過(guò)率為 43.5% 。
題目描述
給定一個(gè)整數(shù),寫(xiě)一個(gè)函數(shù)來(lái)判斷它是否是 3 的冪次方。
題目解析
正常的思路是不停地去除以 3,看最后的迭代商是否為 1。這種思路的代碼使用到了循環(huán),逼格不夠高。
這里取巧的方法 用到了數(shù)論的知識(shí):3 的冪次的質(zhì)因子只有 3 。
題目要求輸入的是 int 類型,正數(shù)范圍是 0 - 2 31 ,在此范圍中允許的最大的 3 的次方數(shù)為 3 19 = 1162261467 ,那么只要看這個(gè)數(shù)能否被 n 整除即可。
一行代碼實(shí)現(xiàn)
class Solution { public boolean isPowerOfThree(int n) { return n > 0 && 1162261467 % n == 0; } }
階乘后的零。題目難度為 Easy,目前通過(guò)率為 38.0% 。
題目描述
給定一個(gè)整數(shù) n ,返回 n ! 結(jié)果尾數(shù)中零的數(shù)量。
題目解析
題目很好理解,數(shù)階乘后的數(shù)字末尾有多少個(gè)零。
最簡(jiǎn)單粗暴的方法就是先乘完再說(shuō),然后一個(gè)一個(gè)數(shù)。
事實(shí)上,你在使用暴力破解法的過(guò)程中就能發(fā)現(xiàn)規(guī)律: 這 9 個(gè)數(shù)字中只有 2(它的倍數(shù)) 與 5 (它的倍數(shù))相乘才有 0 出現(xiàn) 。
所以,現(xiàn)在問(wèn)題就變成了這個(gè)階乘數(shù)中能配 多少對(duì) 2 與 5 。
舉個(gè)復(fù)雜點(diǎn)的例子:
10! = 【 2 *( 2 * 2 )* 5 *( 2 * 3 )*( 2 * 2 * 2 )*( 2 * 5)】
在 10!這個(gè)階乘數(shù)中可以匹配兩對(duì) 2 * 5 ,所以10!末尾有 2 個(gè) 0。
可以發(fā)現(xiàn),一個(gè)數(shù)字進(jìn)行拆分后 2 的個(gè)數(shù)肯定是大于 5 的個(gè)數(shù)的,所以能匹配多少對(duì)取決于 5 的個(gè)數(shù)。
那么問(wèn)題又變成了 統(tǒng)計(jì)階乘數(shù)里有多少個(gè) 5 這個(gè)因子 。
需要注意的是,像 25,125 這樣的不只含有一個(gè) 5 的數(shù)字的情況需要考慮進(jìn)去。
比如 n = 15。那么在 15! 中 有 3 個(gè) 5 (來(lái)自其中的5, 10, 15), 所以計(jì)算n/5 就可以 。
但是比如 n = 25,依舊計(jì)算 n/5 ,可以得到 5 個(gè)5,分別來(lái)自其中的5, 10, 15, 20, 25,但是在 25 中其實(shí)是包含 2個(gè) 5 的,這一點(diǎn)需要注意。
所以除了計(jì)算 n/5 , 還要計(jì)算 n/5/5 , n/5/5/5 , n/5/5/5/5 , ..., n/5/5/5,,,/5直到商為0,然后求和即可。
一行代碼實(shí)現(xiàn)
public class Solution { public int trailingZeroes(int n) { return n == 0 ? 0 : n / 5 + trailingZeroes(n / 5); } }
看完后是不是覺(jué)得也很簡(jiǎn)單,很多時(shí)候其實(shí)人都是有惰性的,不愿意嘗試,你只有把它當(dāng)個(gè)事情認(rèn)真去想,去解,其實(shí)一點(diǎn)都不難!哈哈哈,是不是所謂的:只要思想不滑坡,辦法總比困難多!加油!我的你們!