打卡leetcode第20天

目录

1.2的幂

2.阶乘后的0

3.笨阶乘

4.将找到的值乘以2

5.阶乘函数后K个0

6.整数转罗马数字


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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值