第一次面试的经历

面的是涂鸦移动,一家做手游的公司,在五道口。一面面的还行,二面崩了

  1. 一面来了个比较随意的面试官,上来先问了问项目,项目确实不堪入目。。。他也不太满意,不过简单了解了下就问算法了。先让写了道二分搜索,easy。。。然后问了道“许多个字符串,找出其中出现次数前K多的字符串们”。我看了下,说是不是用HashMap,他说用字典树做比较好,不过只是听说过字典树。。。然后他说那照我的思路做吧,说可以转化一下思路,int型数组里找前K小的数字们,刚好刷过这个题,虽然没记全,不过记得一点思路,跟快排挺像的,说了下,他说还行,让我分析时间复杂度,没答出来,他教了我一下。。。最后是50个数组,每个数组长度为n,每个数组已经有序,设计算法把这50个数组组成一个有序的大数组。他说你想个暴力的吧,想了下,我就说了每两个归并一下,不断弄下去。。。他说还行,然后让我写个归并的代码,easy。。。他说好像还行,问我对公司有什么问题,我随便问了点,然后结束。

  2. 二面就悲剧了,一道也不会。。。面试官先问对手机游戏有什么看法,我只能说没怎么玩过,不太了解。然后他问,“如何防止用户刷礼物”,我思路太死了,没想出来,感觉这应该是个很开放的问题。。。一点想法没有太失败了。然后又是问我一道手游里客户端和服务器的通信协议,瞎扯了什么HTTPS之类的,他明显不满意。最后他也觉得我对手游这个专业的方面不太了解,就问了道算法题:

    1-n的数字,能不能把它们绕成一个环,这个环里每两个相邻的数字之和为质数 没答出来,就结束了。。。

这个对最后一个问题加以分析,在网上搜了一下,发现这个问题称为“素数环”问题。我当时搞成数学问题了。。。其实就是暴力求解就行,回溯法即可。看来算法还是得刷。。。

Java 代码:

// 素数环问题貌似都有n不能超过16这个限制 private static int MAX_NUM = 16;

public void judge(int n) {
	int[] numbers = new int[MAX_NUM]; 	// 储存结果
	boolean[] used = new used[MAX_NUM];		// 辅助数组,记录有没有访问过

	for (int i = 0; i < numbers.length; i++)
		numbers[i] = i + 1;
	
	dfs(1, numbers, used, n);
}


private void dfs(int current, int[] numbers, boolean[] used, int n) {
	
	if ( n == current && isPrime(numbers[0] + numbers[n - 1]) ) {
		for (int i = 0; i < n; i++)
			System.out.print(numbers[i] + "\t);
		system.out.println();
		return;
	}

	
	for (int i = 2; i <= n; i++) {
		if ( !used[i] && isPrime(i + numbers[current - 1]) ) {
			numbers[current] = i;
			used[i] = true;
			dfs(current + 1, numbers, used, n);
			used[i] = false;
		}
	}
}
Written on January 11, 2016