今天刚刚机试完,乘者还没忘记,把自己知道的记下来,也算是泽被后来人吧~~~
这次的机试题,相对来说,会更简单一点,总共3题,时间是3小时。
1 超级幸运数
题目大致描述:
一个数字,若是只含有1和4,这个数字就是幸运数,例如,14,114。但是514这样的就不是了,因为含有其它数字。 若这个幸运数字中,1和4的数量相同,那么就是超级幸运数,例如14,1144,41等等。
题目要求,输入一个n,n的范围是[1,1e9],输出[1,n]的最大超级幸运数。无解的话,输出-1.
解题思路:
这个题目,当n<14,那么显然是无解的,其余情况,最起码还有14,其实就是当>=14的时候,找一个最大的就好了,那么最大有什么规律,假设输入的n有x位,当位数是奇数的时候,输出(x-1)/2个4,和(x-1)/2个1,就好了。如果位数是偶数的话,那么,要考虑一下一些情况了,因为输出是不能大于n的,并且4和1的个数相等。还有,注意这样的数据1000,它的输出应该是41。
一些测试数据:
in: 20 out:14
in: 10 out: -1
in:1000 out: 41
2 移动小球
有一些小球,1,2,。。。,n;
有两种操作,分别是
- 1 x y ,把x移动至y的左边
- 2 x y ,把x移动至y的右边
问得是,m次操作后,小球的顺序是什么..
其实就是这样的,原本1,2,3,4,5.(如果n=5的话)。经过1 1 4操作后,变成2 3 1 4 5
n数据范围[1,1000]
m 数据范围[1,200000]
解题思路:
双向链表就能够解决这个问题。再用一个数组存储这些个节点的位置。
测试数据:
in :
5, 2 (输入是 n m)
1 1 4 (表示操作,1,x, y)
2 4 2
out: 2 4 3 1 5;
3 整理书架
书店管理员要把书架上的书整理一下,其实就是一排书,让书的排序是按照书的高低,每本书有一个重量,重量越大,移动书时越费力,越累,让我们求的是,总的移动书本的最小重量是多少。
给出的数据是:
5(书的数量)
1 2 5 3 3 (表示书的高度)
1 1 3 1 1 (标示书的重量)
输出是2,
为什么是2,因为这里只需要把第4,第5本书移动到第三本书的前面,就能够保证书的有序,移动的重量和是2。
解题思路:
移动的重量和最小,其实就是求,不移动重量和的最大是多少。那么怎么求不移动的最大重量和呢?其实就是记录下每本书的位置,高度,重量,然后按照高度排序,排序完后,按照节点的位置,来求一个最大子序列,不过这个最大子序列,大不在长度上,而是重量和上,这样求出来的最大子序列重量和,就是不移动的最大重量和,总的重量减去它,就是我们要的答案