2016恒生电子秋招笔试两道算法题

来源:互联网 发布:阿里云ecs购买教程 编辑:程序博客网 时间:2024/04/30 15:32
2016恒生电子笔试两道算法题

1.求出1到100之间所有素数,要求时间复杂度最优。
我的最优解决方案是吧素数一个个放入一个素数数组里面(初始吧2放进去),后面的数只要判断是否能够整除这个素数数组里面的所有素数就可以判断是否为素数,如果全部不能整除则为素数。

具体实现很简单,就不给实现了。

2.知道1到100天的股票价格,你最多能进行两次买入卖出,求收益最大是多少。(从第二天开始进行买卖操作)
首先我想到八皇后问题,依照八皇后问题肯定能够解决问题。但是八皇后问题没有从小到大的排序所以要把所有排序遍历,这个操作天数从小到大排序根据这个可以得到更好的算法。考试一时也没有想到,回来以后一时也不好实现,希望各位高手可以给出更好算法,我这里按照八皇后算法思路给出解答,算抛砖引玉了。

2.1)八皇后算法C语言解法
  1. //八皇后问题
  2. //第一个问题:
  3. //设我们要在n行n列的棋盘上放置n个皇后。现假设我们已经把前面的k-1个皇后放好了,我们要考虑如何放置第k个皇后(k小于等于n)。怎么办呢>
  4. //我们的方法是把第k个皇后放到第k行的某一列,怎么确定它是哪一列呢?方法是从第一列到第n列,我们逐个去判断第k个皇后是否合适放到该位置.
  5. //设它现在放的位置是第a[k]列,我们要求
  6. //并且对j=1,...,k-1, 都要求a[k]!=a[j],同时|a[k]-k||!=|a[j]-j|。
  7. //第二个问题:我们在找第k个皇后的合适位置时结果有这样三种:
  8. //1:找到了合适的位置,并且k=n,这时候我们就找到了一组位置来放这些皇后。
  9. //2:找到了合适的位置,但k小于n,这时候我们就要考虑如何放置第k+1个皇后。
  10. //3:没找到合适的位置,这时候怎么办呢?
  11. /*
  12. int x[100];//x[i]表示第i行的数据放入的列号.
  13. bool place(int k)//考察皇后k放置在x[k]列是否与前面行的数据发生冲突
  14. {
  15. int i;
  16. for(i=1;i<k;i++)
  17. if((x[k]==x[i]||abs(k-i)==abs(x[k]-x[i]))
  18. //判断的标准是它不能与前面的每一行的数据放在同一列,并且不能构成对角线
  19. return false;
  20. return true;
  21. }*/
  22. /*void queue(int n)
  23. {
  24. int i,k;
  25. for(i=1;i<=n;i++) //首先让所有皇后的初始位置都为第0列。
  26. x[i]=0;
  27. k=1;//从第一个皇后开始搜素
  28. while(k>=1)
  29. {
  30. x[k]=x[k]+1; //在下一列放置第k个皇后
  31. while(x[k]<n&&!place(k))//x[k]<=n表示第k个皇后还有位置可放, !place(k)表示当前位置不适合
  32. x[k]=x[k]+1;//搜索下一列
  33. if(x[k]<=n&&k==n)//得到一个输出
  34. {
  35. for(i=1;i<=n;i++)
  36. printf("%d ",x[i]);
  37. printf("\n");
  38. //return;//若return则只求出其中一种解,若不return则可以继续回溯,求出全部的可能的解
  39. }
  40. else if(x[k]<=n&&k<n)
  41. k=k+1;//放置下一个皇后
  42. else
  43. {
  44. x[k]=0;//重置x[k],回溯
  45. k=k-1;
  46. }
  47. }
  48. }*/
  49. //要点:当程序发现目前无法放置第k个皇后时,它会调整第k-1个皇后的位置,
  50. //实现过程是;k=k-1;x[k]=x[k]+1;
  51. //等它调整好k-1个皇后的位置时,要重新从1个位置开始重新放置第k个皇后。
  52. //实现过程是;x[k]=0;x[k]=x[k]+1;
  53. /* void main()
  54. {
  55. int n;
  56. printf("输入皇后个数n:\n");
  57. scanf("%d",&n);
  58. queue(n);
  59. }*/
2.2)股票最优解算法:
    
  1. package test;
  2. import java.util.Random;
  3. import java.util.TreeSet;
  4. public class HenShengTest {
  5. static int STARTNUM=2;//操作开始时间
  6. static int ALLNUM = 5;//一共有多少天的价格数据
  7. static int BoughtNum= 4;//交易次数,必须是2的倍数
  8. static int [] a = new int[ALLNUM+1]; //股票输入的ALLNUM个数字的价格
  9. static int [] x=new int [BoughtNum+1];//放置每次操作的所在天数,本题系数大于等于5就行
  10. static TreeSet<Integer> setFin=new TreeSet<>();//放置相应操作次数的最优解,BoughtNum= 4时会放入两次操作和四次操作的最优解
  11. static boolean place(int k)//考察k步操作放置在x[k]列是否与前面行的数据发生冲突
  12. {
  13. int i;
  14. for(i=1;i<k;i++)
  15. if(x[k]<=x[i])//第K部操作天数必须比前面的天数都要大
  16. return false;
  17. return true;
  18. }
  19. static void queue(int n)
  20. {
  21. TreeSet<Integer> set = new TreeSet<>();
  22. int [] b=new int[n+1];//每次操作的最大天数,比如四次操作则放置{97,98,99,100}
  23. int i,k;
  24. for(i=1;i<=n;i++) //首先让所有操作的初始位置都为第STARTNUM-1天。
  25. x[i]=STARTNUM-1;
  26. for (int j = 1; j <= n; j++) {
  27. b[j]=ALLNUM-n+j;
  28. }
  29. k=1;//从第一步操作开始搜素
  30. while(k>=1)
  31. {
  32. x[k]=x[k]+1; //本次操作天数加一
  33. while(x[k]<b[k]&&!place(k))//x[k]<b[k]表示第k个操作还有位置可放, !place(k)表示当前天数不适合
  34. x[k]=x[k]+1;//搜索下一列
  35. if(x[k]<=b[k]&&k==n)//得到一个输出
  36. {
  37. set.add(-a[x[4]]+a[x[3]]-a[x[2]]+a[x[1]]);
  38. }
  39. else if(x[k]<=b[k]&&k<n)
  40. k=k+1;//放置下一个操作
  41. else
  42. {
  43. x[k]=0;//重置x[k],回溯
  44. k=k-1;
  45. }
  46. }
  47. setFin.add(set.last());
  48. }
  49. /**
  50. *放置操作次数的最优解进入 setFin
  51. */
  52. public static void countAll(){
  53. while (BoughtNum>0) {
  54. queue(BoughtNum);
  55. BoughtNum-=2;
  56. }
  57. }
  58. public static void main(String[] args) {
  59. for (int i = 1; i <= ALLNUM; i++) {
  60. Random random =new Random();
  61. a[i]=random.nextInt(100);
  62. }
  63. for (int i : a) {
  64. System.out.print(i+" ");
  65. }
  66. countAll();
  67. System.out.println();
  68. /*System.out.println();
  69. queue(BoughtNum);*/
  70. if (setFin.last()<0) {
  71. System.out.println("we can't buy anything............");
  72. }
  73. System.out.println(setFin.last());
  74. }
  75. }
0 0