摘要:計算階乘中尾部零的個數描述計算出階乘中尾部零的個數樣例,故返回分析對數字做質數分解,例如,可以知道能夠在尾部產生零的只有質數和質數的乘積由于是階乘,質數的個數明顯大于質數的個數特別需要注意的是,類似,數字里面是有的指數的因而,總的個數應當是
1.計算階乘中尾部零的個數 描述:
計算出n階乘中尾部零的個數
樣例:11! = 39916800,故返回2
分析對數字做質數分解,例如20=225,可以知道能夠在尾部產生零的只有質數2和質數5的乘積
由于是階乘,質數2的個數明顯大于質數5的個數
特別需要注意的是,類似25=5*5,數字里面是有5的指數的
因而,總的個數應當是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. 打印數字 描述
給一個整數n. 從 1 到 n 按照下面的規則打印每個數:
如果這個數被3整除,打印fizz
如果這個數被5整除,打印buzz
如果這個數能同時被3和5整除,打印fizz buzz
樣例比如 n = 15, 返回一個字符串數組:
[
"1", "2", "fizz",
"4", "buzz", "fizz",
"7", "8", "fizz",
"buzz", "11", "fizz",
"13", "14", "fizz buzz"
]
邏輯清晰簡單,并無值得分析之處
解答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; }
給定一個排序的整數數組和一個要查找的整數target,用O(logn)的時間查找到target第一次出現的下標(從0開始),如果target不存在于數組中,返回-1
樣例在數組 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2
分析簡單的二分查找問題,無須分析
解答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.出現次數統計 描述:
計算數字k在0到n中的出現的次數,k可能是0~9的一個值
樣例例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我們發現1出現了5次 (1, 10, 11, 12)
分析假設一個數n=4324,先考慮低位上的規律(先不計入千位)
只考慮個位數上的出現次數(n>10),則可以按照0~9,10~19來劃分,每10個數字出現1次,記為$$1*10^0$$
只考慮十位數和個位數的出現次數(n>100),則除了個位數上的出現次數,在十位數上,還會出現10次重復,即10+10*1=20,記為$$2*10^1$$
只考慮百位數和十位、各位數的出現次數(n>1000),則在百位數上會出現100次重復,同時,前面討論的重復次數會再增加十倍,即100+20*10,記為$$3*10^2$$
再考慮千位本身,此時千位數字為4
若k<4,那么在千位上會出現1000次重復
若k=4,那么在千位上會出現324+1次重復
若k>4,那么在前為上不會出現重復
其它數字規律以此類推
解答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 } //計算式對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; } //計算式對0不通用,需要再+1 if (k == 0) { sum += 1; } return sum; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71124.html
摘要:前言相信大家在面試或者工作中偶爾會遇到遞歸算法的提問或者編程,我們今天來聊一聊從數學歸納法到理解遞歸算法。這種廣義的數學歸納法應用于數學邏輯和計算機科學領域,稱作結構歸納法。 showImg(https://img-blog.csdnimg.cn/20190426221838971.gif);showImg(https://img-blog.csdnimg.cn/20190429222...
摘要:在此期間,移動端開發工程師可謂是風生水起,幾乎人們日常生活中接觸互聯網的途徑,都是通過一個叫的東西,基于這兩大系統平臺。而上面說的這些事情,都是當今移動端開發者的機會。 古典程序員集體恐慌 隨著2007年第一臺iPhone問世,隨后Android的猛烈跟進,蘋果和谷歌推動了長達10年的移動互聯網浪潮。在此期間,移動端開發工程師可謂是風生水起,幾乎人們日常生活中接觸互聯網90%的途徑,都...
閱讀 1964·2021-11-22 15:29
閱讀 3259·2021-10-14 09:43
閱讀 1227·2021-10-08 10:22
閱讀 3349·2021-08-30 09:46
閱讀 1435·2019-08-30 15:55
閱讀 1930·2019-08-30 15:44
閱讀 853·2019-08-30 14:19
閱讀 1448·2019-08-30 13:13