今日头条笔试题(一)
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; }
我面试时就写的这个,我现在就写个伪代码,不知道是不是最好的,希望大家多多思考,多多指正。
相关文章推荐
- 今日头条,笔试题
- 今日头条笔试题:“最小数字*区间和”的最大值【单调栈】
- [今日头条] 2017客户端工程师实习生笔试题
- 今日头条笔试题,任务调度问题
- 2018春招-今日头条笔试题-第二题(python)
- 2017.04.19:今日头条数据分析笔试01
- [笔试练习]今日头条实习笔试
- 今日头条笔试
- 或与加(今日头条笔试)
- 今日头条笔试【编程题 + 分析过程发现数学规律 + 回溯法】
- 今日头条2017后端工程师笔试题
- 算法面试题-今日头条2017客户端工程师实习生笔试题4:或与加
- 今日头条2017客户端工程师实习生笔试题
- 今日头条2018笔试第二题
- 多边形构成问题(今日头条笔试题)
- 串珠问题(今日头条笔试)
- [今日头条] 笔试题目2016/9/28
- 今日头条研发算法岗实习生笔试题解答篇_0324晚
- 今日头条笔试题
- 今日头条春招研发笔试题解密