172.阶乘后的零
题目链接
10 = 2 * 5,比n小是2的倍数的数肯定比是5的多,所以只需要看因子5出现的次数
class Solution {
public:
int trailingZeroes(int n) {
int ans = 0;
while(n){
n/=5;
ans += n;
}
return ans;
}
};
189.旋转数组
题目链接
比较普通的思路是一次替换一个循环,这个东西的循环节应该是gcd(k,len),比较直观的解释是等于gcd(k%len,len),然后这东西是等价于前面那个东西的
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int len = nums.size();
k%=len;
int cnt = 0;
for(int i = 0;cnt < len;i++){
int nw ,pre = i;
int t = nums[i];
do{
nw = pre;
pre = (nw - k + len)%len;
nums[nw] = nums[pre];
cnt++;
}while(pre != i);
nums[nw] = t;
}
}
};
比较巧妙的思路是反转三次数组
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int len = nums.size();
k%=len;
reverse(nums.begin(),nums.end());
reverse(nums.begin(),nums.begin()+k);
reverse(nums.begin()+k,nums.end());
}
};