数学题
172. Factorial Trailing Zeroes
Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity. (Easy)
分析:求n的阶乘中末位0的个数,也就是求n!中因数5的个数(2比5多),简单思路是遍历一遍,对于每个数,以此除以5求其因数5的个数,但会超时。
考虑到一个数n比他小能被5整除的数的个数是一定的(n / 5),由此再考虑能被25整除,125整除的数的个数,得到如下算法:
代码:
1 class Solution { 2 public: 3 int trailingZeroes(int n) { 4 int sum = 0; 5 while (n > 0) { 6 sum += (n / 5); 7 n /= 5; 8 } 9 return sum; 10 } 11 };
258. Add Digits
Given a non-negative integer num
, repeatedly add all its digits until the result has only one digit.
For example:
Given num = 38
, the process is like: 3 + 8 = 11
, 1 + 1 = 2
. Since 2
has only one digit, return it. (Easy)
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
分析:
考虑到
ab % 9 = (9a + a + b) % 9 = (a + b) % 9;
abc % 9 = (99a + 9 b + a + b + c) % 9 = (a + b + c) % 9;
所以求到其只有个位数位置即用其mod 9即可,考虑到被9整除的数应该返回9而非0,采用先减一再加一方式处理。
代码:
1 class Solution { 2 public: 3 int addDigits(int num) { 4 if (num == 0) { 5 return 0; 6 } 7 return (num - 1) % 9 + 1; 8 } 9 };
268. Missing Number
Given an array containing n distinct numbers taken from 0, 1, 2, ..., n
, find the one that is missing from the array.
For example,
Given nums = [0, 1, 3]
return 2
. (Medium)
分析:
采用先求和(前n项和),再将求和结果与数组和相减的方法,求得差哪个数
代码:
1 class Solution { 2 public: 3 int missingNumber(vector<int>& nums) { 4 int n = nums.size(); 5 int sum1 = n * (n + 1) / 2; 6 int sum2 = 0; 7 for (int i = 0; i < nums.size(); ++i) { 8 sum2 += nums[i]; 9 } 10 return sum1 - sum2; 11 } 12 };