游戏测试工程师面试题

进修社 人气:6.27K

1、返回两个有序数组合并后的第K个的数。

游戏测试工程师面试题

思路:折半查找法

分别找两个数组中的第K/2的位置的元素(假设数组中的元素下标从1开始),然后进行比较,较小的则前K/2个元素可舍弃,不用考虑(因为他们必定比第K个数小),接下来在剩余的元素中找第(K-K/2)个数,依次类推。如果某一个数组到头了,就直接从另一个数组中取出指定的数。

举例说明,

A={1,3,5,7,9}

B={2,4,6,8,10}

K=5,

首先令剩下需要找的元素个数为 left,初始化为left=5;

折半的位置mid=5/2=2;

(假设下标从1开始)

A[2]=3,B[2]=4,A[2]<b[2],那么a的前mid(mid=2)个元素可以不考虑(这里是说不考虑,并不是要删除它),因为他们必定比第5个数小< p="">

现在,

A={5,7,9}

B={2,4,6,8,10}

接下来,就要在A、B中要找第(left=left-mid=5-2=3)个元素;

left=3,mid=3/2=1;

A[1]=5,B[1]=2,A[1]>B[1],那么B的前mid(mid=1)个元素可以不考虑,那么,

A={5,7,9}

B={4,6,8,10}

接下来,就要在A、B中要找第(left=left-mid=3-1=2)个元素;

left=2,mid=2/2=1;

A[1]=5,B[1]=4,A[1]>B[1],那么B的前mid(mid=1)个元素可以不考虑,那么,

A={5,7,9}

B={6,8,10}

接下来,就要在A、B中要找第(left=left-mid=2-1=1)个元素;

找第1个元素很简单,只要比较A,B的第一个元素就可以了,哪个小就是哪个。

A[1]=5,B[1]=6,A[1]<b[1],所以要找的元素就是5.< p="">

同样,如果K=10,要找第10个元素,那么就将A[5]与B[5]进行比较,发现A[5]<b[5],那么就不考虑a前面的5个元素,此时< p="">

A={}

B={2,4,6,8,10}

left=5,

那么就可以直接从B数组中提取第5个元素10,即,要找的元素就是10.

2、判断带头结点的单链表中是否有环。

判断一个单链表是否有环及环的'链接点

主要思想:追赶法,采用两个指针,快指针每次走两步,慢指针每次走一步,当两个指针相遇,就表示有环。

这里面试官提出了一个问题,为什么不是一个走4步,一个走3步。当时被绕进去了没想明白,其实拿笔画一下就明白了,

两个指针一个走4步,一个走3步也可以,最终也能找到环,但是可能要走好几圈两个指针才能相遇。而采用一个走2步,一个走1步,快指针走一圈或一圈多一点(不到两圈)就可以与慢指针相遇。

总结的一点心得就是,面试官并非总是引导你找到正确的方法,有时候也会误导你,让你的思维比较混乱,所以时刻要保持清醒的头脑,思维要清晰,当有些混乱的时候,就要从头理一理,多动笔。我想面试也是一场博弈吧,希望下次好运!

3、箱子里面有一百个球,甲和乙分别拿球,每次最少一个,最多5个,拿到第一百个球的人获胜。若甲先拿,请问他第一次要拿几个,怎么保证他能拿到第一百个球。

思路:反向递推法

要拿到第100个球,必须保证拿到第94个球,

要保证拿到第94个球,必须保证拿到第88个球,

依次类推,

每次都要保证拿到第100-6*N个球,

最小是100%6=4个球,(100对6取余为4)

那么最开始要拿4个球。后来每次确保拿到的个数与乙拿的球的个数和为6.比如,乙拿1个,甲就拿5个;乙拿2个,甲就拿4个,依次类推。

总结一下,一般式:如果N个球,甲和乙分别拿球,每次最多拿K个,最少拿一个,甲先拿,要确保甲拿到最后一个球,那么,甲第一次就要拿(N%(K+1))个,后来每次确保与另一方拿的球的个数和为(K+1)个。

另外,还问了一个问题,面试官问我桌子上的那个装抽纸的木盒子还能用来干什么,发动你的思维充分想象一下。这个问题见仁见智吧!主要看思维够不够活跃,够不够创新!