今日头条笔试题(一)

来源:互联网 发布:手机家装软件 编辑:程序博客网 时间:2024/04/29 04:58

车厢排序

一列火车有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[n]; //期望顺序static int A[n]; //bool数组,开出的车厢号,即经过了铁轨1、2的车厢static int max; //已出车厢最大号码,大于这个号码的任何车厢都可以出static int only; //小于max的车厢只有一个,这个唯一的号码存在only中

主函数:

int main(){    //输入的n和期望序列存储在n和Arrays[n]中    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;}

我面试时就写的这个,我现在就写个伪代码,不知道是不是最好的,希望大家多多思考,多多指正。

原创粉丝点击