第k个数

题目描述

有一些数的素因子只有3、5、7,请设计一个算法,找出其中的第k个数。
给定一个数int k,请返回第k个数。保证k小于等于100。
测试样例:

算法:
使用3个队列分别保存着3的倍数,5的倍数,7的倍数。每次循环找到当前队头即最小值,这个值就是第n个所求数。
这个值出自哪个队列x,说明现在3个队列内的所有数的最小数是x的倍数,那么需要将所有队头继续扩大x倍,因为x倍的数最小了

key:3可以乘3,5,7队列,5可以乘5,7队列,7可以乘7队列。因为3乘了5,5就不需要乘3了

class KthNumber {
public:
    int findKth(int k) {
        // write code here
        queue<int> que3;
        queue<int> que5;
        queue<int> que7;
        //init
        que3.push(3);
        que5.push(5);
        que7.push(7);
        //begin
        int count = 0;
        int key = 0;
        while (count < k){
            int key3,key5,key7;
            if(!que3.empty()){
                key3 = que3.front();
            }
            else
                key3 = INT_MAX;

            if(!que5.empty()){
                key5 = que5.front();
            }
            else
                key5 = INT_MAX;

            if(!que7.empty()){
                key7 = que7.front();
            }
            else
                key7 = INT_MAX;

            key = min(min(key3,key5),key7);
            if(key == key3){
                que3.push(key * 3);
                que5.push(key * 5);
                que7.push(key * 7);
                que3.pop();
            }
            else if(key == key5){
                que5.push(key * 5);
                que7.push(key * 7);
                que5.pop();
            }
            else{
                que7.push(key * 7);
                que7.pop();
            }
            count++;
        }
        return key;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值