摘要:計(jì)算階乘中尾部零的個(gè)數(shù)描述計(jì)算出階乘中尾部零的個(gè)數(shù)樣例,故返回分析對(duì)數(shù)字做質(zhì)數(shù)分解,例如,可以知道能夠在尾部產(chǎn)生零的只有質(zhì)數(shù)和質(zhì)數(shù)的乘積由于是階乘,質(zhì)數(shù)的個(gè)數(shù)明顯大于質(zhì)數(shù)的個(gè)數(shù)特別需要注意的是,類(lèi)似,數(shù)字里面是有的指數(shù)的因而,總的個(gè)數(shù)應(yīng)當(dāng)是
1.計(jì)算階乘中尾部零的個(gè)數(shù) 描述:
計(jì)算出n階乘中尾部零的個(gè)數(shù)
樣例:11! = 39916800,故返回2
分析對(duì)數(shù)字做質(zhì)數(shù)分解,例如20=225,可以知道能夠在尾部產(chǎn)生零的只有質(zhì)數(shù)2和質(zhì)數(shù)5的乘積
由于是階乘,質(zhì)數(shù)2的個(gè)數(shù)明顯大于質(zhì)數(shù)5的個(gè)數(shù)
特別需要注意的是,類(lèi)似25=5*5,數(shù)字里面是有5的指數(shù)的
因而,總的個(gè)數(shù)應(yīng)當(dāng)是n/5 + n/(55) + n/(55*5) + ...
解答fun trailingZeors(n: Long): Long { var num : Long = n / 5 var zeroNums : Long = num while (num > 0){ num /= 5 zeroNums += num } return zeroNums }
public long trailingZeros(long n) { long num = n / 5; long zeroNums = num; while (num > 0) { num /= 5; zeroNums += num; } return zeroNums; }2. 打印數(shù)字 描述
給一個(gè)整數(shù)n. 從 1 到 n 按照下面的規(guī)則打印每個(gè)數(shù):
如果這個(gè)數(shù)被3整除,打印fizz
如果這個(gè)數(shù)被5整除,打印buzz
如果這個(gè)數(shù)能同時(shí)被3和5整除,打印fizz buzz
樣例比如 n = 15, 返回一個(gè)字符串?dāng)?shù)組:
[
"1", "2", "fizz",
"4", "buzz", "fizz",
"7", "8", "fizz",
"buzz", "11", "fizz",
"13", "14", "fizz buzz"
]
邏輯清晰簡(jiǎn)單,并無(wú)值得分析之處
解答fun fizzBuzz(n : Int) : Array{ var output : Array = Array(n, {""}) for (i in 1..n) { if (i % 3 == 0 && i % 5 == 0) { output[i-1] = "fizz buzz" } else if (i % 3 == 0) { output[i-1] = "fizz" } else if (i % 5 == 0) { output[i-1] = "buzz" } else { output[i-1] = i.toString() } } return output }
public List3.二分查找 描述fizzBuzz(int n) { // write your code here List output = new ArrayList<>(); for (int i=1; i<=n; i++) { if (i % 3 == 0 && i % 5 == 0) { output.add("fizz buzz"); } else if (i % 3 == 0) { output.add("fizz"); } else if (i % 5 == 0) { output.add("buzz"); } else { output.add(String.valueOf(i)); } } return output; }
給定一個(gè)排序的整數(shù)數(shù)組和一個(gè)要查找的整數(shù)target,用O(logn)的時(shí)間查找到target第一次出現(xiàn)的下標(biāo)(從0開(kāi)始),如果target不存在于數(shù)組中,返回-1
樣例在數(shù)組 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2
分析簡(jiǎn)單的二分查找問(wèn)題,無(wú)須分析
解答fun binarySearch(nums : IntArray, target : Int) : Int { var start = 0 var end = nums.size while (end - start > 1) { var mid = (end + start) / 2 when { nums[mid] > target -> end = mid nums[mid] < target -> start = mid else -> return mid } } return when(target) { nums[start] -> start nums[end] -> end else -> -1 } }4.出現(xiàn)次數(shù)統(tǒng)計(jì) 描述:
計(jì)算數(shù)字k在0到n中的出現(xiàn)的次數(shù),k可能是0~9的一個(gè)值
樣例例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我們發(fā)現(xiàn)1出現(xiàn)了5次 (1, 10, 11, 12)
分析假設(shè)一個(gè)數(shù)n=4324,先考慮低位上的規(guī)律(先不計(jì)入千位)
只考慮個(gè)位數(shù)上的出現(xiàn)次數(shù)(n>10),則可以按照0~9,10~19來(lái)劃分,每10個(gè)數(shù)字出現(xiàn)1次,記為$$1*10^0$$
只考慮十位數(shù)和個(gè)位數(shù)的出現(xiàn)次數(shù)(n>100),則除了個(gè)位數(shù)上的出現(xiàn)次數(shù),在十位數(shù)上,還會(huì)出現(xiàn)10次重復(fù),即10+10*1=20,記為$$2*10^1$$
只考慮百位數(shù)和十位、各位數(shù)的出現(xiàn)次數(shù)(n>1000),則在百位數(shù)上會(huì)出現(xiàn)100次重復(fù),同時(shí),前面討論的重復(fù)次數(shù)會(huì)再增加十倍,即100+20*10,記為$$3*10^2$$
再考慮千位本身,此時(shí)千位數(shù)字為4
若k<4,那么在千位上會(huì)出現(xiàn)1000次重復(fù)
若k=4,那么在千位上會(huì)出現(xiàn)324+1次重復(fù)
若k>4,那么在前為上不會(huì)出現(xiàn)重復(fù)
其它數(shù)字規(guī)律以此類(lèi)推
解答fun digitCounts(k : Int, n : Int) : Int { var num = n var sum = 0 while (num > 0) { val len = num.toString().length - 1 val base = Math.pow(10.0, len.toDouble()).toInt() sum += len * (base / 10) * (num / base) if (k > 0 && num / base > k) { sum += base } else if (k > 0 && num / base == k) { sum += num % base + 1 } num %= base } //計(jì)算式對(duì)0不通用,需要再+1 if (k == 0) { sum += 1 } return sum }
public int digitCounts(int k, int n) { int sum = 0; while (n > 0) { int len = String.valueOf(n).length() - 1; int base = (int)Math.pow(10, len); sum += len * (base / 10) * (n / base); if (k > 0 && n / base > k) { sum += base; } else if (k > 0 && n / base == k) { sum += n % base + 1; } n %= base; } //計(jì)算式對(duì)0不通用,需要再+1 if (k == 0) { sum += 1; } return sum; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71124.html
摘要:前言相信大家在面試或者工作中偶爾會(huì)遇到遞歸算法的提問(wèn)或者編程,我們今天來(lái)聊一聊從數(shù)學(xué)歸納法到理解遞歸算法。這種廣義的數(shù)學(xué)歸納法應(yīng)用于數(shù)學(xué)邏輯和計(jì)算機(jī)科學(xué)領(lǐng)域,稱(chēng)作結(jié)構(gòu)歸納法。 showImg(https://img-blog.csdnimg.cn/20190426221838971.gif);showImg(https://img-blog.csdnimg.cn/20190429222...
摘要:在此期間,移動(dòng)端開(kāi)發(fā)工程師可謂是風(fēng)生水起,幾乎人們?nèi)粘I钪薪佑|互聯(lián)網(wǎng)的途徑,都是通過(guò)一個(gè)叫的東西,基于這兩大系統(tǒng)平臺(tái)。而上面說(shuō)的這些事情,都是當(dāng)今移動(dòng)端開(kāi)發(fā)者的機(jī)會(huì)。 古典程序員集體恐慌 隨著2007年第一臺(tái)iPhone問(wèn)世,隨后Android的猛烈跟進(jìn),蘋(píng)果和谷歌推動(dòng)了長(zhǎng)達(dá)10年的移動(dòng)互聯(lián)網(wǎng)浪潮。在此期間,移動(dòng)端開(kāi)發(fā)工程師可謂是風(fēng)生水起,幾乎人們?nèi)粘I钪薪佑|互聯(lián)網(wǎng)90%的途徑,都...
閱讀 1968·2021-11-22 15:29
閱讀 3271·2021-10-14 09:43
閱讀 1236·2021-10-08 10:22
閱讀 3357·2021-08-30 09:46
閱讀 1442·2019-08-30 15:55
閱讀 1938·2019-08-30 15:44
閱讀 861·2019-08-30 14:19
閱讀 1457·2019-08-30 13:13