算法_面试题 17.06.第k个数

165 阅读2分钟

题目

设计一个算法找出素因子只有,3或者5或者7的K个数。

image.png

知识回忆补充

素数(也就是质数):只能被1和本身整除的整数。  

合数:除过被1和本身整除之外还能被其他数整除的整数。  

因子(因数也叫约数):就是能整除一个整数的数字,就是因子。  

素因子:就是能整除一个整数的素数。比如3*3=9,3就是素因子。  

每个合数都能写成几个质数(因数)相乘,这几个质数(因数)叫做这个合数的质因子(素因子)

image.png

分析一波

其实就是3个指针的一个题目 ;
因为是素因子为3或者5或者7,所以可定义这3个指针;
分别为p3,p5,p7分别记录3,5,7素因子走的下标;
创建一个数组去记录素因子是3或者5或者7的整数,默认第一个肯定就是1啦,因为1是任何数的素因子; 设计个循环去存符合条件的整数;
每次以p3,p5,p7指标走的位置上的整数去和3/5/7去相乘计算出最小的符合条件的整数;
因为符合条件的数组肯定是个升序的,所以每次取里面最小的符合条件的整数去存;
然后如果存的这个最新的符合条件的整数和当前哪个指针的值相等,就让它往前走一步;

最后,返回第K个数就行;

实践,上代码分析

/**
 * @param {number} k
 * @return {number}
 */
var getKthMagicNumber = function(k) {
    let p3=0,p5=0,p7=0,vei=[];
    vei[0]=1;
    for(var i=1;i<k;i++){
        vei[i]=Math.min(Math.min(vei[p3]*3,vei[p5]*5,vei[p7]*7));
        if(vei[i]===vei[p3]*3) p3++;
        if(vei[i]===vei[p5]*5) p5++;
        if(vei[i]===vei[p7]*7) p7++;
    }
    return vei[k-1]

};

定义3个指针,值分别为0;
然后定义一个空数组去存符合条件的整数;
利用for循环去存符合条件的这个数;
让i小于k;
把3个指针当前的在数组里的值乘以3/5/7,然后取里面最小的值去存在数组当前的位置;
哪个指针对应的值和当前存数组的值相等,就让该指针向前走一步; 最后,返回第K个值就ok了;

自己手稿画了一遍:

7967a36dc7feb4999beb5d346de8a36.jpg