2016恒生电子秋招笔试两道算法题
来源:互联网 发布:阿里云ecs购买教程 编辑:程序博客网 时间:2024/04/30 15:32
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++)
printf("%d ",x[i]);
printf("\n");
//return;//若return则只求出其中一种解,若不return则可以继续回溯,求出全部的可能的解
}
else if(x[k]<=n&&k<n)
k=k+1;//放置下一个皇后
else
{
x[k]=0;//重置x[k],回溯
k=k-1;
}
}
}*/
//要点:当程序发现目前无法放置第k个皇后时,它会调整第k-1个皇后的位置,
//实现过程是;k=k-1;x[k]=x[k]+1;
//等它调整好k-1个皇后的位置时,要重新从1个位置开始重新放置第k个皇后。
//实现过程是;x[k]=0;x[k]=x[k]+1;
/* void main()
{
int n;
printf("输入皇后个数n:\n");
scanf("%d",&n);
queue(n);
}*/
2.2)股票最优解算法:
package test;
import java.util.Random;
import java.util.TreeSet;
public class HenShengTest {
static int STARTNUM=2;//操作开始时间
static int ALLNUM = 5;//一共有多少天的价格数据
static int BoughtNum= 4;//交易次数,必须是2的倍数
static int [] a = new int[ALLNUM+1]; //股票输入的ALLNUM个数字的价格
static int [] x=new int [BoughtNum+1];//放置每次操作的所在天数,本题系数大于等于5就行
static TreeSet<Integer> setFin=new TreeSet<>();//放置相应操作次数的最优解,BoughtNum= 4时会放入两次操作和四次操作的最优解
static boolean place(int k)//考察k步操作放置在x[k]列是否与前面行的数据发生冲突
{
int i;
for(i=1;i<k;i++)
if(x[k]<=x[i])//第K部操作天数必须比前面的天数都要大
return false;
return true;
}
static void queue(int n)
{
TreeSet<Integer> set = new TreeSet<>();
int [] b=new int[n+1];//每次操作的最大天数,比如四次操作则放置{97,98,99,100}
int i,k;
for(i=1;i<=n;i++) //首先让所有操作的初始位置都为第STARTNUM-1天。
x[i]=STARTNUM-1;
for (int j = 1; j <= n; j++) {
b[j]=ALLNUM-n+j;
}
k=1;//从第一步操作开始搜素
while(k>=1)
{
x[k]=x[k]+1; //本次操作天数加一
while(x[k]<b[k]&&!place(k))//x[k]<b[k]表示第k个操作还有位置可放, !place(k)表示当前天数不适合
x[k]=x[k]+1;//搜索下一列
if(x[k]<=b[k]&&k==n)//得到一个输出
{
set.add(-a[x[4]]+a[x[3]]-a[x[2]]+a[x[1]]);
}
else if(x[k]<=b[k]&&k<n)
k=k+1;//放置下一个操作
else
{
x[k]=0;//重置x[k],回溯
k=k-1;
}
}
setFin.add(set.last());
}
/**
*放置操作次数的最优解进入 setFin
*/
public static void countAll(){
while (BoughtNum>0) {
queue(BoughtNum);
BoughtNum-=2;
}
}
public static void main(String[] args) {
for (int i = 1; i <= ALLNUM; i++) {
Random random =new Random();
a[i]=random.nextInt(100);
}
for (int i : a) {
System.out.print(i+" ");
}
countAll();
System.out.println();
/*System.out.println();
queue(BoughtNum);*/
if (setFin.last()<0) {
System.out.println("we can't buy anything............");
}
System.out.println(setFin.last());
}
}
0 0
- 2016恒生电子秋招笔试两道算法题
- 恒生电子2015春季校招笔试题
- 恒生电子笔试题:LoopMove
- 2014恒生电子笔试题
- 恒生校招笔试题
- 2017秋招-技术岗-恒生电子
- 08年恒生电子成都笔试题
- 恒生电子的坑爹Java笔试题
- 2017年5月13日 恒生电子笔试题
- 一、恒生电子面试 (校招)
- 2013年恒生电子笔试面试题
- 阿里秋招在线笔试两道编程题
- 恒生电子
- Java知识:恒生电子的坑爹笔试题扩展的知识
- 【恒生电子16年校招编程题】求两有序数组的交集并返回交集个数
- 2011年恒生电子校园招聘笔试题目
- 恒生笔试
- 名企笔试:腾讯2016秋招笔试编程题 2017-03-04 算法爱好者
- VS2013配置OpenGL
- Centos配置国内yum源
- [代码片段]提升Win32进程权限
- linux下编译faac库
- arm-xilinx-linux-gnueabi-gcc: error trying to exec 'cc1': execvp: No such file or directory
- 2016恒生电子秋招笔试两道算法题
- 技术项目经理与管理型项目经理的区别
- 完全解析Android DskLrucache
- 我的android审视之旅-----http的无状态和tcp的基于连接
- 长连接
- linux基础-unit1
- spring实战一
- 蓝鸥Unity3D ——游戏/VR/AR开发课程大纲
- lighttpd的超时参数详解