目录
1.2的幂
【题目】
【分析】
法1/2:二进制表示
bool isPowerOfTwo(int n){
//法3递归
if(n==0) return false;
if(n==1) return true;
if(n%2!=0)
return false;
else
return isPowerOfTwo(n/2);
//法2
//return n>0 && (n&(-n))==n;
//--法1--
//return n>0 && (n&(n-1))==0;
}
2.阶乘后的0
【题目】
【解析】计算1-n之中有多少个5的因数
int trailingZeroes(int n){
int cnt = 0;
for (int x = n / 5; x > 0; x /= 5) cnt += x;
return cnt;
}
3.笨阶乘
【题目】
【分析】
int clumsy(int N){
int ans = N > 2 ? N * (N-1) / (N-2) + (N-3) : N;
N -= 4;
while(N > 0) {
ans -= N > 2 ? N * (N-1) / (N-2) - (N-3) : N;
N -= 4;
}
return ans;
}
4.将找到的值乘以2
【题目】
【分析】
法1:先快排再遍历
int cmp(const void *a,const void *b){
return *(int *)a-*(int *)b;
}
int findFinalValue(int* nums, int numsSize, int original){
qsort(nums,numsSize,sizeof(int),cmp);
for(int i=0;i<numsSize;i++){
if(nums[i]==original)
original=original*2;
}
return original;
}
法2:递归
int findFinalValue(int* nums, int numsSize, int original){
for(int i=0;i<numsSize;i++){
if(nums[i]==original)
return findFinalValue(nums,numsSize,original*2);
}
return original;
}
法3:哈希表
class Solution {
public:
int findFinalValue(vector<int>& nums, int original) {
unordered_set<int> s(nums.begin(), nums.end());
while (s.count(original)) {
original *= 2;
}
return original;
}
};
5.阶乘函数后K个0
【题目】
【分析】
int preimageSizeFZF(int K){
int step=0;
while (step < K) step = step * 5 + 1;
while (K) {
step = (step - 1) / 5;
if (K / step == 5) return 0;
K %= step;
}
return 5;
}
6.整数转罗马数字
【题目】
【分析】
char * intToRoman(int num){
int value[13] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
char* chara[13] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
char* roman = (char*)malloc(sizeof(char)*16);
roman[0] = '\0';
for(int i = 0; i < 13;i++){
while(num >= value[i]){
num -= value[i];
strcat(roman,chara[i]);
}
if(num == 0)
break;
}
strcat(roman,"\0");
return roman;
}