2016恒生电子笔试两道算法题
1.求出1到100之间所有素数,要求时间复杂度最优。
我的最优解决方案是吧素数一个个放入一个素数数组里面(初始吧2放进去),后面的数只要判断是否能够整除这个素数数组里面的所有素数就可以判断是否为素数,如果全部不能整除则为素数。
具体实现很简单,就不给实现了。
2.知道1到100天的股票价格,你最多能进行两次买入卖出,求收益最大是多少。(从第二天开始进行买卖操作)
首先我想到八皇后问题,依照八皇后问题肯定能够解决问题。但是八皇后问题没有从小到大的排序所以要把所有排序遍历,这个操作天数从小到大排序根据这个可以得到更好的算法。考试一时也没有想到,回来以后一时也不好实现,希望各位高手可以给出更好算法,我这里按照八皇后算法思路给出解答,算抛砖引玉了。
2.1)八皇后算法C语言解法
//八皇后问题
//第一个问题:
//设我们要在n行n列的棋盘上放置n个皇后。现假设我们已经把前面的k-1个皇后放好了,我们要考虑如何放置第k个皇后(k小于等于n)。怎么办呢>
//我们的方法是把第k个皇后放到第k行的某一列,怎么确定它是哪一列呢?方法是从第一列到第n列,我们逐个去判断第k个皇后是否合适放到该位置.
//设它现在放的位置是第a[k]列,我们要求
//并且对j=1,...,k-1, 都要求a[k]!=a[j],同时|a[k]-k||!=|a[j]-j|。
//第二个问题:我们在找第k个皇后的合适位置时结果有这样三种:
//1:找到了合适的位置,并且k=n,这时候我们就找到了一组位置来放这些皇后。
//2:找到了合适的位置,但k小于n,这时候我们就要考虑如何放置第k+1个皇后。
//3:没找到合适的位置,这时候怎么办呢?
/*
int x[100];//x[i]表示第i行的数据放入的列号.
bool place(int k)//考察皇后k放置在x[k]列是否与前面行的数据发生冲突
{
int i;
for(i=1;i<k;i++)
if((x[k]==x[i]||abs(k-i)==abs(x[k]-x[i]))
//判断的标准是它不能与前面的每一行的数据放在同一列,并且不能构成对角线
return false;
return true;
}*/
/*void queue(int n)
{
int i,k;
for(i=1;i<=n;i++) //首先让所有皇后的初始位置都为第0列。
x[i]=0;
k=1;//从第一个皇后开始搜素
while(k>=1)
{
x[k]=x[k]+1; //在下一列放置第k个皇后
while(x[k]<n&&!place(k))//x[k]<=n表示第k个皇后还有位置可放, !place(k)表示当前位置不适合
x[k]=x[k]+1;//搜索下一列
if(x[k]<=n&&k==n)//得到一个输出
{
for(i=1;i<=n;i++)