Design an algorithm to find the kth number such that the only prime factors are 3,5 and 7

方法一:

a[i]=min{a[s1]*3,a[s2]*5,a[s3]*7};

s1<i,s2<i,s3<i   &&    a[s1]*3>a[i-1],a[s2]*3>a[i-1],a[s3]*7>a[i-1]

时间复杂度O(n^2)

  1. #include<stdio.h>
  2.  
  3. int min(int a,int b,int c)
  4. {
  5. int smallest = a<b?a:b;
  6. smallest = smallest<c?smallest:c;
  7. return smallest;
  8. }
  9.  
  10. int func(int k)
  11. {
  12. int m3=;
  13. int m5=;
  14. int m7=;
  15. int *p = new int[k+];
  16. p[]=;
  17. for(int i=;i<=k;i++)
  18. {
  19. for(int j=;j<i;j++)
  20. {
  21. if(p[j]*>p[i-])
  22. {
  23. m7=p[j]*;
  24. break;
  25. }
  26. }
  27. for(int j=;j<i;j++)
  28. {
  29. if(p[j]*>p[i-])
  30. {
  31. m5=p[j]*;
  32. break;
  33. }
  34. }
  35. for(int j=;j<i;j++)
  36. {
  37. if(p[j]*>p[i-])
  38. {
  39. m3=p[j]*;
  40. break;
  41. }
  42. }
  43. p[i]=min(m3,m5,m7);
  44. }
  45. int r = p[k];
  46. delete[] p;
  47. p = NULL;
  48. return r;
  49. }
  50.  
  51. int main()
  52. {
  53. int k=;
  54. printf("%dth:%d\n",k,func(k));
  55. return ;
  56. }

方法二:

将1填入输出数组的第一位,然后准备三个队列Q3,Q5,Q7,分别压入1*3,1*5,1*7

第i位就是三个队列的队首元素中最小的,然后将该元素从队列取出:

如果是从Q3取出,则将该数分别乘以3,5,7,再将三个数分别插入到Q3,Q5,Q7队尾

如果是从Q5取出,则将该数分别乘以5,7,再将两个数分别插入到Q5,Q7队尾

如果是从Q7取出,则将该数乘以7,再将结果插入到Q7队尾

直到取出第K+1位(1不算)

时间复杂度O(n)

  1. #include<iostream>
  2. #include<deque>
  3.  
  4. using namespace std;
  5.  
  6. int func(int k)
  7. {
  8. deque<int>Q3;
  9. deque<int>Q5;
  10. deque<int>Q7;
  11. int pi=;
  12. Q3.push_back();
  13. Q5.push_back();
  14. Q7.push_back();
  15. for(int i=;i<k+;i++)
  16. {
  17. if(Q3.front()<Q5.front() && Q3.front()<Q7.front())
  18. {
  19. pi=Q3.front();
  20. Q3.pop_front();
  21. Q3.push_back(*pi);
  22. Q5.push_back(*pi);
  23. Q7.push_back(*pi);
  24. }
  25. else if(Q5.front()<Q3.front() && Q5.front()<Q7.front())
  26. {
  27. pi=Q5.front();
  28. Q5.pop_front();
  29. Q5.push_back(*pi);
  30. Q7.push_back(*pi);
  31. }
  32. else if(Q7.front()<Q3.front() && Q7.front()<Q5.front())
  33. {
  34. pi=Q7.front();
  35. Q7.pop_front();
  36. Q7.push_back(*pi);
  37. }
  38. else
  39. {
  40. cout<<"error"<<endl;
  41. }
  42. }
  43. return pi;
  44. }
  45.  
  46. int main()
  47. {
  48. for(int k=;k<;k++)
  49. {
  50. cout<<k<<"th:"<<func(k)<<endl;
  51. }
  52. return ;
  53. }

Cracking the Coding Interview 10.7的更多相关文章

  1. Cracking the Coding Interview(Trees and Graphs)

    Cracking the Coding Interview(Trees and Graphs) 树和图的训练平时相对很少,还是要加强训练一些树和图的基础算法.自己对树节点的设计应该不是很合理,多多少少 ...

  2. Cracking the Coding Interview(Stacks and Queues)

    Cracking the Coding Interview(Stacks and Queues) 1.Describe how you could use a single array to impl ...

  3. 《Cracking the Coding Interview》读书笔记

    <Cracking the Coding Interview>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...

  4. Cracking the coding interview

    写在开头 最近忙于论文的开题等工作,还有阿里的实习笔试,被虐的还行,说还行是因为自己的水平或者说是自己准备的还没有达到他们所需要人才的水平,所以就想找一本面试的书<Cracking the co ...

  5. Cracking the coding interview 第一章问题及解答

    Cracking the coding interview 第一章问题及解答 不管是不是要挪地方,面试题具有很好的联系代码总用,参加新工作的半年里,做的大多是探索性的工作,反而代码写得少了,不高兴,最 ...

  6. Cracking the coding interview目录及资料收集

    前言 <Cracking the coding interview>是一本被许多人极力推荐的程序员面试书籍, 详情可见:http://www.careercup.com/book. 第六版 ...

  7. 《Cracking the Coding Interview》——第18章:难题——题目10

    2014-04-29 04:22 题目:给定一堆长度都相等的单词,和起点.终点两个单词,请从这堆单词中寻找一条变换路径,把起点词变成终点词,要求每次变换只能改一个字母. 解法:Leetcode中有Wo ...

  8. 《Cracking the Coding Interview》——第17章:普通题——题目10

    2014-04-28 23:54 题目:XML文件的冗余度很大,主要在于尖括号里的字段名.按照书上给定的方式进行压缩. 解法:这题我居然忘做了,只写了一句话的注解.用python能够相对方便地实现,因 ...

  9. 《Cracking the Coding Interview》——第13章:C和C++——题目10

    2014-04-25 20:47 题目:分配一个二维数组,尽量减少malloc和free的使用次数,要求能用a[i][j]的方式访问数据. 解法:有篇文章讲了六种new delete二维数组的方式,其 ...

随机推荐

  1. 如何创建一个项目,让gitlab自动触发jenkins进行构建

    前进是:你已经配置好jenkins+gitlab自动化布置了,这里只是常规构建新的项目时,需要做的配置,记录下来,以免忘了又着急 参考这篇博客: https://www.jianshu.com/p/e ...

  2. Android组件化最佳实践 ARetrofit原理

    ARetrofit原理讲原理之前,我想先说说为什么要ARetrofit.开发ARetrofit这个项目的思路来源其实是Retrofit,Retrofit是Square公司开发的一款针对Android网 ...

  3. 企业级mysql数据库完全备份、增量备份脚本

    企业完全备份脚本 [root@client ~]# vim /opt/mysql_bak_wanbei.sh #!/bin/bash #MySQL数据库完全备份脚本 #设置登录变量 MY_USER=& ...

  4. resize监听div的size变化

    具体实现分两类, ie9-10 默认支持div的resize事件,可以直接通过div.attachEvent('onresize', handler);的方式实现 其它浏览器 通过在div中添加一个内 ...

  5. 1 WebService 常见问题

    <binding name="> <readerQuotas maxStringContentLength=" /> </binding> &l ...

  6. sysbench_memory

    对于内存而言,这里--memory-total-size=100G 就是 意味着 total number of events: 104857600 1. --memory-total-size=10 ...

  7. 观察者模式之Golang实现

    观察者模式的具体概念原理,参见https://baike.baidu.com/item/%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/5881786?fr ...

  8. Laravel实用小功能

    Laravel实用小功能 1.控制访问次数 laravel5.2的新特性,通过中间件设置throttle根据IP控制访问次数 原理:通过回传三个响应头X-RateLimit-Limit,X-RateL ...

  9. linux - redis基础

    目录 linux - redis基础 redis 源码编译安装 redis 数据结构 1. strings类型 2. list 类型 3. sets集合类型 有序集合 5. 哈希数据结构 centos ...

  10. (44). Spring Boot日志记录SLF4J【从零开始学Spring Boot】

    在开发中打印内容,使用 System.out.println() 和 Log4j 应当是人人皆知的方法了. 其实在开发中我们不建议使用 System.out 因为大量的使用 System.out 会增 ...