14

/*

* 时间复杂度O(N),按书中所讲,3个素数因子3、5、7分为三个队列

q3,q5,q7,其中最初存放3,5,7

* 之后每次添加找到三个队列头中最小的数,起初为3,将3移出队列

q3后,在q3添加3*3,在q5添加3*5,q7中添加3*7

* 此时可知q3{3*3},q5{5,3*5},q7{7,3*7}

* 下一轮找到最小数为5,重复上述步骤,将5从q5移出,添加5*5到

q5,因为5*3已经添加过所以不需要添加到q3中

* 将5*7添加到q7,结果q3{3*3},q5{3*5,5*5},q7{7,3*7,5*7}

* 依次找到第k个数

*/

public int findKth(int k) {

// write code here

if(k < 0){

return 0;

}

int val = 0;

Queue q3 = new LinkedList();

Queue q5 = new LinkedList();

Queue q7 = new LinkedList();

q3.add(1);

for(int i = 0 ; i <= k; i++){

int v3 = q3.size() > 0? q3.peek() : Integer.MAX_VALUE;

int v5 = q5.size() > 0? q5.peek() : Integer.MAX_VALUE;

int v7 = q7.size() > 0? q7.peek() : Integer.MAX_VALUE;

val = Math.min(v3, Math.min(v5,v7));

if(val == v3){

q3.remove();

q3.add(val*3);

q5.add(val*5);

}else if(val == v5){

q5.remove();

q5.add(val*5);

}else if(val == v7){

q7.remove();

}

q7.add(val*7);

}

return val;

}

编辑于 2015-11-02 14:27:13

回复(1)

8

import java.util.*;

/*

思路:每个数都是找三个数中最小的数*3或5或7得出来的,

*/

public class KthNumber {

public int findKth(int k) {

int [] array =new int[k];

int num3=0;

int num5=0;

int num7=0;

array[0]=3;

array[1]=5;

array[2]=7;

for(int i=3;i

array[i]=Math.min(Math.min(array[num3]*3,array[num5]*5),array[num7]*7);

if(array[i]==array[num3]*3) num3++;

if(array[i]==array[num5]*5) num5++;

if(array[i]==array[num7]*7) num7++;

}

return array[k-1];

}

}

运行时间:17ms

占用内存:8668k

发表于 2017-06-28 14:06:51

回复(5)

3

public int findKth(int k) {

// write code here

int[] map = new int[k + 1];

int mul3 = 0, mul5 = 0, mul7 = 0;

int result3 = 0, result5 = 0, result7 = 0;

int index = 1;

map[0] = 1;

while (index <= k) {

result3 = map[mul3] * 3;

result5 = map[mul5] * 5;

result7 = map[mul7] * 7;

if (result3 <= result5 && result3 <= result7) {

++mul3;

if (result3 > map[index - 1]) {

map[index] = result3;

++index;

}

} else if (result5 <= result3 && result5 <= result7) {

++mul5;

if (result5 > map[index - 1]) {

map[index] = result5;

++index;

}

} else if (result7 <= result3 && result7 <= result5) {

++mul7;

if (result7 > map[index - 1]) {

map[index] = result7;

++index;

}

}

}

return map[k];

}

发表于 2016-04-11 22:57:02

回复(0)

5

这道题的思路,首先可以排除偶数,因为2是素数,而且只能包含3,5,7素因子,可以这样理解,这样的数,最后一定会被拆成若干个3,若干个5,若干个7连成,不然不满足条件,所以代码如下

public static intfindKth(intk) { // write code hereintcount=0; doublei=3; while(count

{ if(i%2!=0)

{ doubleb=i; while(b%3==0||b%5==0||b%7==0)

{ if(b%7==0)

{

b=b/7;

} else if(b%5==0)

{

b=b/5;

} else{

b=b/3;

}

} if(b==1)

{

count++;

}

}

i++;

} return(int)i-1;

}

发表于 2015-10-11 16:52:25

回复(2)

2

参考了wuafeing的思路:我来解释一下,如果一个数只有3,5,7这几个素因子,那一定是满足

这样形式的,3*5*7*k,所以首先除以3,然后除以5,最后除以7,如果是符合条件的,最后肯定

就是1,可能有人会说也可能是2,3,4,5,6啊,注意到这些数只有2,4可能,因为3,5在前面

已经作为除数了,最后的结果不会有3,5了,而6呢,本质就是2。

下面提供2种思路:

class KthNumber {

public:

int findKth(int k) {

/*int num = 3;

while(num && k){

int temp = num;

while(temp%3 ==0)

temp /= 3;

while(temp%5 ==0)

temp /= 5;

while(temp%7 ==0)

temp /= 7;

if(1 == temp)

k--;

num++;

}

return --num;*/

vector res(k+1);

int i=0,j=0,t=0;

res[0]=1;

int num=0;

for(int h=1;h<=k;h++)//不能从0开始,不然res[0]=3;影响第二个数5的产生

{

num=min(res[i]*3,min(res[j]*5,res[t]*7));

res[h]=num;

if(num==res[i]*3) i++;

if(num==res[j]*5) j++;

if(num==res[t]*7) t++;

}

return res[k];

}

};

编辑于 2017-09-11 11:47:44

回复(0)

2

思路

使用三个队列q2、q3、q5,最初存放2、3、5;

取出队首最小的值: 2.1. 若从q2中取出,则分别X2、X3、X5,分别添加至q2、q3、q5的末尾; 2.2.

若从q3中取出,则分别X3、X5,分别添加至q3、q5的末尾; 2.3. 若从q5中取出,则分别X5,分别添加至q5的末尾;

代码

public int findKth(int k) {

LinkedList q3 = new LinkedList<>();

LinkedList q5 = new LinkedList<>();

LinkedList q7 = new LinkedList<>();

q3.offer(3);

q5.offer(5);

q7.offer(7);

int index = 1;

int min = 0;

while( index<=k ){

min = Math.min(q3.peek(), Math.min(q5.peek(), q7.peek()));

if ( min==q3.peek() ) {

q3.poll();

q3.offer(min*3);

q5.offer(min*5);

q7.offer(min*7);

}

if ( min==q5.peek() ) {

q5.poll();

q5.offer(min*5);

q7.offer(min*7);

}

if ( min==q7.peek() ) {

q7.poll();

q7.offer(min*7);

}

index++;

}

return min;

}

发表于 2017-04-01 14:31:58

回复(0)

3

class KthNumber {

public:

int findKth(int k) {

// write code here

int num = 3;

while(num && k){

int temp = num;

while(temp%3 ==0)

temp /= 3;

while(temp%5 ==0)

temp /= 5;

while(temp%7 ==0)

temp /= 7;

if(1 == temp)

k--;

num++;

}

return --num;

}

};

//类似丑数算法!最简洁的,木有之一

发表于 2015-10-30 17:49:00

回复(2)

2

python 一行解法: class KthNumber:

def findKth(self, k):

return sorted([3**i*5**j*7**l for i in range(10) for j in range(10) for l in range(5)])[k]

发表于 2017-10-21 18:04:23

回复(0)

1

class KthNumber {

public:

int findKth(int k) {

// write code here

vector num3,num5,num7;

int i3 = 0, i5 = 0, i7 = 0,res;

num3.push_back(3);

num5.push_back(5);

num7.push_back(7);

for (int i = 0; i < k; ++i) {

res = min(min(num3[i3],num5[i5]),num7[i7]);

if(res == num3[i3]) i3++;

if(res == num5[i5]) i5++;

if(res == num7[i7]) i7++;

num3.push_back(3 * res);

num5.push_back(5 * res);

num7.push_back(7 * res);

}

return res;

}

};

发表于 2019-06-11 14:52:50

回复(0)

1

class KthNumber {

public:

/*  关键:

1 下一个丑数 = 在之前生成的丑数数组中寻找一个数 * (3或5或7),即大于当前丑数的最小值

设当前丑数为M

3*T3=M3 > M  【公式(1)】

5*T5=M5 > M  【公式(2)】

7*T7=M7 > M  【公式(3)】

从中令新的M = min(M3 , M5 , M7),并更新T3,T5,T7,使得新的T3,有3*T3 > M,同理T5,T7    【操作1】

如果不更新,带来的问题就是,会陷入死循环

比如刚开始M=1,初始T3=T5=T7=1,满足上述条件后,M=3,此时3*T3 <= M,则T3=1没有等于3,同理后续T5=1,T7=1,而M=7,

之后就发现T3,T5,T7中没有一个能符合上述公式(1),(2),(3),则M一直变成7不再变化;

为了防止这种情况,要进行上述操作1的处理,为的就是能够作为下一个丑数M的候选值能够一直变大

*/

int min(int a , int b , int c)

{

int minNum = a < b ? a : b;

minNum = minNum < c ? minNum : c;

return minNum;

}

int findKth(int k)

{

int *pArray = new int[k + 1];

pArray[0] = 1;

int* p3 , *p5 , *p7;

p3 = p5 = p7 = pArray;

int count = 0;

int minNum;

while(count < k)

{

count++;

minNum = min( *p3 * 3 , *p5 * 5 , *p7 * 7);

pArray[count] = minNum;

//注意等号不能取,while中循环条件如果改成 *p3 * 3 < minNum 是错误的,这样会陷入死循环,使得minNum候选的几个候选值不再变化

while( *p3 * 3 <= minNum )

{

p3++;

}

while( *p5 * 5 <= minNum)

{

p5++;

}

while( *p7 * 7 <= minNum)

{

p7++;

}

}

int result = pArray[k];

delete[] pArray;

return result;

}

};

发表于 2018-08-31 16:34:05

回复(0)

1

# -*- coding:utf-8 -*-

class KthNumber:

def findKth(self, k):

# write code here

queue3=[3]

queue5=[5]

queue7=[7]

count=0

while count

min_s=min(queue3[0],queue5[0],queue7[0])

if min_s==queue3[0]:

min_s=queue3.pop(0)

queue3.append(min_s*3)

queue5.append(min_s*5)

elif min_s==queue5[0]:

min_s=queue5.pop(0)

queue5.append(min_s*5)

else:

min_s==queue7[0]

min_s=queue7.pop(0)

queue7.append(min_s*7)

count+=1

return min_s

编辑于 2017-07-11 11:18:37

回复(0)

1

class KthNumber {

public:

int findKth(int k) {

// write code here

int i = 3; int temp = 0;

while (k){

temp = i;

while (temp % 3 == 0)temp /= 3;

while (temp % 5 == 0)temp /= 5;

while (temp % 7 == 0)temp /= 7;

if (temp == 1)k--;

i++;

}

return i-1;

}

};

-

编辑于 2017-03-13 20:49:40

回复(0)

1

//对于合法的数,存放于队列中,开始为:3,5,7

//以当前合法的数为基础,采用淘汰机制

//淘汰的原则是队列的首个元素如果乘以7小于队列最后一个元素

//则说明该元素乘以3,5,7均已经加入队列,该元素可以淘汰

//而队列添加元素的准则是当前元素乘以3,5,7中最小的一个

class KthNumber {

public:

int findKth(int k) {

vector v{ 3, 5, 7 };

if (k <= 3) return v[k - 1];

int count = 3;

while (count < k){

if (v.front() * 7 <= v.back()) v.erase(v.begin());

else{

int i = 1, min = findMinAvaliable(v[0], v.back());

while (v[i] * 3 < min && i < v.size()){

if (findMinAvaliable(v[i], v.back()) < min){

min = findMinAvaliable(v[i], v.back());

}

i++;

}

v.push_back(min);

count++;

}

}

return *(v.end()-1);

}

int findMinAvaliable(int n, int key){

int min = 0;

if (n * 3 > key) min = n * 3;

else{

if (n * 5 > key) min = n * 5;

else min = n * 7;

}

return min;

}

};

发表于 2016-09-17 18:37:24

回复(0)

1

public int findKth(int k) {

// write code here

int[] nums = new int[k+1];

nums[0]=1;

int n3=0;

int n5=0;

int n7=0;

int index=0;

while(index

index++;

nums[index] = min(nums[n3]*3,nums[n5]*5,nums[n7]*7);

if(nums[n3]*3==nums[index])

n3++;

if(nums[n5]*5==nums[index])

n5++;

if(nums[n7]*7==nums[index])

n7++;

}

return nums[index];

}

public int min(int a , int b,int c){

return Math.min(a,Math.min(b,c));

}

发表于 2016-08-27 23:42:32

回复(0)

1

//思路1:题目说保证K小于100,所以就用暴力法写一下了。

class KthNumber {

public:

int findKth(int k) {

// write code here

int count=0;

int i=3;

while(count

{

if(isP(i))

{

count++;

}

i++;

}

return i-1;

}

bool isP(int number)

{

if(number<3) return false;

while(number%3==0) number=number/3;

while(number%5==0) number=number/5;

while(number%7==0) number=number/7;

return ((number==1)?true:false);

}

};

/*思路2:3,5,7满足题目要求,那么3,5,7的3倍、5倍、7倍依然是满足题目要求的;

用队列实现,代码如下。*/

class KthNumber {

public:

int findKth(int k) {

// write code here

queue q3;

queue q5;

queue q7;

int count=1;

int i=1;

while(count<=k)

{

q3.push(i*3);

q5.push(i*5);

q7.push(i*7);

int min3=q3.front();

int min5=q5.front();

int min7=q7.front();

int min=((min3

min=((min

if(min==min3) q3.pop();

if(min==min5) q5.pop();

if(min==min7) q7.pop();

i=min;

count++;

}

return i;

}

};

发表于 2016-08-12 09:40:07

回复(0)

1

十分朴素的解法,应该都能看懂。

class KthNumber {

public:

int findKth(int k) {

// write code here

if(k<=0)

return 0;

int temp;

int array[100]={0};

array[0]=3;array[1]=5;array[2]=7;

if(k<=3)

return array[k-1];

int t3,t5,t7,t31,t51,t71;

t31=t51=t71=0;

for(int i=3;i<100;i++){

t3 = 3 * array[t31];

t5 = 5 * array[t51];

t7 = 7 * array[t71];

if(t3

array[i]=t3;

t31++;

}else{

if(t5

array[i]=t5;

t51++;

}else{

array[i]=t7;

t71++;

}

}

if(array[i]==array[i-1])

i--;

}

return array[k-1];

}

};

发表于 2016-05-20 01:35:19

回复(0)

1

public int findKth(int k) {

LinkedList l1 = new LinkedList<>();

LinkedList l2 = new LinkedList<>();

LinkedList l3 = new LinkedList<>();

l1.add(3);

l2.add(5);

l3.add(7);

int val = 3;

for (int i = 1; i <= k; i++) {

int a = l1.peek(), b = l2.peek(), c = l3.peek();

val = Math.min(Math.min(a, b), c);

if (val == a) {

l1.removeFirst();

l1.add(val * 3);

l2.add(val * 5);

} else if (val == b) {

l2.removeFirst();

l2.add(val * 5);

} else

l3.removeFirst();

l3.add(val * 7);

}

return val;

}

发表于 2016-04-11 11:57:44

回复(0)

1

class KthNumber {

public:

int findKth(int k) {

if(k<0||k>100)

return 0;

int temp;

queue q3,q5,q7;

q3.push(3);

q5.push(5);

q7.push(7);

for(int cn=0;cn

{

temp=min(min(q3.front(),q5.front()),q7.front());

if(temp==q3.front())

{

q3.pop();

q3.push(temp*3);

q5.push(temp*5);

q7.push(temp*7);

}

else if(temp==q5.front())

{

q5.pop();

q5.push(temp*5);

q7.push(temp*7);

}

else

{

q7.pop();

q7.push(temp*7);

}

}

return temp;

}

};

我们可以用3个队列来维护这些数。第1个队列负责乘以3,第2个队列负责乘以5, 第3个队列负责乘以7。算法描述如下:

1. 初始化结果temp=1和队列q3,q5,q7

2. 分别往q3,q5,q7插入1*3,1*5,1*7

3. 求出三个队列的队头元素中最小的那个x,更新结果res=x

4. 如果x在:

q3中,那么从q3中移除x,并向q3,q5,q7插入3*x,5*x,7*x

q5中,那么从q5中移除x,并向q5,q7插入5*x,7*x

q7中,那么从q7中移除x,并向q7插入7*x

5. 重复步骤3-5,直到找到第k个满足条件的数

注意,当x出现在q5中,我们没往q3中插入3*x,那是因为这个数在q5中已经插入过了。

发表于 2015-10-10 16:49:30

回复(0)

1

class KthNumber {

public:

int findKth(int k) {

int num[105];

int pos3, pos5, pos7;

pos3 = pos5 = pos7 = 0;

num[0] = 1;

for(int i = 1 ; i <= k ; i++)

{

num[i] = min(num[pos3] * 3, min(num[pos5] * 5, num[pos7] * 7));

if(num[i] == num[pos3] * 3) pos3++;

if(num[i] == num[pos5] * 5) pos5++;

if(num[i] == num[pos7] * 7) pos7++;

}

return num[k];

}

};

发表于 2017-12-06 21:53:08

回复(0)

0

# -*- coding:utf-8 -*-

class KthNumber:

def findKth(self, k):

# write code here

result = [1]

i3, i5, i7 = 0, 0, 0

while len(result)

result.append(min( 3 * result[i3], 5 * result[i5],7 * result[i7],))

if result[-1] == 3 * result[i3]: i3 += 1

if result[-1] == 5 * result[i5]: i5 += 1

if result[-1] == 7 * result[i7]: i7 += 1

return result[-1]

发表于 2020-10-20 20:15:03

回复(0)

JAVA素因子只有3 5 7_第k个数相关推荐

  1. [剑指offer][JAVA][面试第40题][最小的k个数][快选][堆][BST]

    [问题描述]面试第40题 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 : 输入:arr ...

  2. 找出一堆数中最小的前K个数

    描写叙述: 给定一个整数数组.让你从该数组中找出最小的K个数 思路: 最简洁粗暴的方法就是将该数组进行排序,然后取最前面的K个数就可以. 可是,本题要求的仅仅是求出最小的k个数就可以,用排序能够但显然 ...

  3. 单向链表中查找倒数第K个数

    问题 单向链表如果要找某一元素或者遍历链表,只能从头节点开始,所以如果我们用普通方法查找倒数第K个数,要分两步:第一步:先遍历链表中元素的个数,第二步:从头开始遍历,遍历到链表个数-k个数; 用两个指 ...

  4. 【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...

  5. JAVA算法:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合(JAVA)

    JAVA算法:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合(JAVA) 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合.. 当 n = 4 ...

  6. 最小的k个数 java_【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 思 ...

  7. java笔试题:海量数据找最大或最小的k个数(堆排序)

    题目 海量数据找最大或最小的k个数,这里以找最小的K个数为例 堆排序 例如给一个数组nums[]这棵树就是完全二叉树,则: nums[i]的左节点为:num[2 * i + 1] nums[i]的右节 ...

  8. 小k java_leetcode——面试题 17.14. 最小K个数 (java快速排序)

    描述:设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 输入: arr = [1,3,5,7,2,4,6,8], k = 4 输出: [1,2,3,4] 解题思路: 这题因为不要求排 ...

  9. Java实现k个数乘(cheng)(自然数的k乘积问题)

    k个数乘(cheng) 题目描述 桐桐想把一个自然数N分解成K个大于l的自然数相乘的形式,要求这K个数按从小到大排列,而且除了第K个数之外,前面(K-l)个数是N分解出来的最小自然数.例如:N=24, ...

最新文章

  1. python时间日期字符串各种
  2. 17岁读大学,25岁博士毕业,高颜值医生爆红网络,却坦言只是普通人
  3. 详解BSCI实验四:配置BGP
  4. 「鸡娃」是家长无处安放的「应试」焦虑
  5. 为Chrome多账户添加单独的快捷方式
  6. AngularJs入门学习
  7. 杨振宁在物理学界的地位和成就
  8. mongodb和mysql的对比_Mongodb与mysql语法比较
  9. ios手机怎么连接adb命令_没有 mac 的福音,windows 下对 ios 进行操作 (类似 android 的 adb 操作)...
  10. 卢克沃顿对于湖人作用
  11. 双级减速器优化matlab,基于matlab的二级齿轮减速器的优化设计.doc
  12. seo技术_基础知识_网站pr值的意义_日思663.带你入门SEO基础知识
  13. LED字体下载,可视化大屏,数据可视化必备
  14. 无需翻墙解决谷歌浏览器-谷歌翻译无法使用的解决方法
  15. Window 配置RabbitMQ
  16. python拼图游戏代码_Python图像处理——人物拼图游戏
  17. Linux用户与群组管理
  18. oracle数据库恢复aul_AUL/MyDUL 非常规灾难恢复ORACLE数据
  19. Spring的IOC和AOP课堂笔记
  20. nestjs listen EADDRINUSE: address already in use :::3000

热门文章

  1. 如何理解Go语言的GOROOT/GOPATH
  2. android 录音amr格式转换,android – 以AMR文件格式录制音频
  3. 如何将瑞克和莫蒂的字幕和音频抓下来练习口语
  4. 百度云 登陆不上错误码码1550010
  5. 播放mp4视频,有声音无图像,AVC(H264)编码转换
  6. CMOS芯片cmos image sensor
  7. 解决xcode iOS真机调试正常,模拟器失败问题
  8. 计算机软件实习日志(三)基于 A*搜索算法迷宫游戏开发
  9. 大数据多元化教学评价_多元化
  10. F407_07_UART概述