您的位置:首页 > 职场人生

今日头条笔试题(一)

2017-12-23 15:57 239 查看

车厢排序

一列火车有n个车厢标记为1,2,3,4,5,6…n

现在因为某些原因,需要调整车厢的相对顺序

例如需要将车厢顺序调整为2,3,1,4,5,6…n

由于车厢庞大,且车厢只能停留在铁轨上,所以不能随心所欲的调整相对顺序

现在只能利用两条并行的铁轨对车厢的顺序进行调整

例如

原序列为1,2的车厢

车厢1进入铁轨1停止

车厢2进入铁轨2,然后再开出

然后铁轨1上的车厢1再开出

这样可以使得车厢2调整到车厢1得前面

现在给你一个期望得到的车厢顺序,请你判断该顺序能否通过以上方法调整车厢顺序而得到

(车厢只能前进无法后退)

输入格式

第一行n表示有n个车厢

第二行有n个数为1~n的排列用空格隔开,表示期望得到的车厢顺序

输出:若可以得到则输出Yes 否则输出No

样例输入1:

2

2 1

样例输出1:

Yes

样例输入2:

5

3 4 1 5 2

样例输出2:

Yes

样例输入3:

5

3 4 2 1 5

样例输出3:

No

个人分析:

比如样例输入2:

5

3 4 1 5 2

样例输出2:

Yes

图解题意:



车厢1、2进入铁轨2,车厢3、4、5进入铁轨1,铁轨就像队列一样,先进先出



车厢5先停留下来,铁轨2的车厢1先行开出:



然后车厢5先出,车厢2最后开出即可。

而样例输入3:

5

3 4 2 1 5

样例输出3:

No

开始



车厢1、2进入铁轨2,车厢3、4、5进入铁轨1,铁轨就像队列一样,先进先出



然而车厢3、4车厢出来之后,车厢2无法开出,所以这个顺寻不可行:



故不可以做到,输出No。

算法分析:

或许最接地气的算法就是用链表或者队列什么的,我分析给出如下算法:

关键变量:

int n; //车厢节数
int Arrays
; //期望顺序

static int A
; //bool数组,开出的车厢号,即经过了铁轨1、2的车厢
static int max; //已出车厢最大号码,大于这个号码的任何车厢都可以出
static int only; //小于max的车厢只有一个,这个唯一的号码存在only中


主函数:

int main()
{
//输入的n和期望序列存储在n和Arrays
中

for(int i=0;i<n;i++)//逐个车厢检测
{
if(!fun(传入参数))//按序判断一节车厢是否可以
{
printf("No");
return 0;
}
}
printf("Yes");
return 0;
}


两个函数,第一个为判断一节车厢是否可以:

int fun(传入参数)
{
if(该节车厢号为1){
max=1;
return 1; //表示可以
}
else if(该节车厢大于max){
max=a;
return 1; //表示可以
}
else if(该节车厢小于max并且刚好等于only){
only=changeonly(传入参数); //改变only
return 1; //表示可以
}
else
return 0; //表示不可以
}


第二个函数为改变only值:

int changeonly(传入参数)
{
for(i=only;only<max;i++)
{
if(A[i]==0)
only=i;
}
return only;
}


我面试时就写的这个,我现在就写个伪代码,不知道是不是最好的,希望大家多多思考,多多指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息