【剑指offer】丑数(数组)

题目描述

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

链接

https://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b?tpId=13&tqId=11186&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

代码

//class Solution {
//public:
//    int GetUglyNumber_Solution(int index) {
//        // 先找出1000000以内的全部质数
//        int zhishuSize = 10000;
//        int uglySize = 10000;
//        bool zhishu[zhishuSize];
//        for(int i = 0; i < zhishuSize; i++){
//            zhishu[i] = 1;
//        }
//        for(int i = 2; i < zhishuSize; i++){
//            if(zhishu[i]){
//                for(int j = i + 1; j < zhishuSize; j++){
//                    if(j%i == 0){
//                        zhishu[j] = 0;
//                    }
//                }
//            }
//        }
        for(int i = 2; i < zhishuSize; i++){
            if(zhishu[i]){
                cout << i << " ";
            }
        }
//        //把丑数表中的数,如果能被大于7的质数整除z,则不是丑数
//        bool ugly[uglySize];
//        for(int i = 0; i < uglySize; i++){
//            ugly[i] = 1;
//        }
//        for(int i = 7; i < zhishuSize; i++){
//            if(zhishu[i] == 1){
//                for(int j = 7; j < uglySize; j++){
//                    if(ugly[j] == 1 && j % i == 0){
//                        ugly[j] = 0;
//                    }
//                }
//            }
//        }
        for(int i = 1; i < uglySize; i++){
            if(ugly[i]){
                cout << i << " ";
            }
        }
//        int ans = 0;
//        for(int i = 1; i < uglySize; i++){
//            if(ugly[i] == 1){
//                ans = i;
//                index--;
//            }
//            if(index == 0){
//                ans = i;
//                break;
//            }
//        }
//        return ans;
//    }
//};

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index == 0){
            return 0;
        }
        int a[index];
        a[0] = 1;
        int p2 = 0;
        int p3 = 0;
        int p5 = 0;
        for(int i = 1; i < index; i++){
            int min = getMin(a[p2]*2, a[p3]*3, a[p5]*5);
            a[i] = min;
            if(a[p2]*2 == min){
                p2++;
            }
            if(a[p3]*3 == min){
                p3++;
            }
            if(a[p5]*5 == min){
                p5++;
            }
        }
        return a[index-1];
    }
    int getMin(int a, int b, int c){
        if(a > b){
            swap(a, b);
        }
        if(a > c){
            swap(a, c);
        }
        return a;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值