https://docs.google.com/document/d/1qxA2wps0IhVRWULulQ55W4SGPMu2AE5MkBB37h8Dr58/
第三轮:白人小哥,在google已经工作了7年,开始让我狂问他问题,然后眉飞色舞的回答了我的问题,这个阶段大概聊了超过10分钟。然后问的算法题叫bingo game。让我随机生成一张5*5的棋盘,只有两个限制:
- 第一行的所有数字在1-15的范围内,第二行在16-30的范围内,以此类推
- 每一行的数字不能有重复
给了个api:random(min, max),可以返回[min, max]内的随机数字
follow up是生成n张这种棋盘,保证n张棋盘中的同一行没有完全相同的一行
思路:
当时看到题目是懵逼的,感觉太过简单,小心翼翼的多次确认,确实只有这两个限制,然后我说我想每一行用set存放已经生成过的数字,然后新生成的数字fill进棋盘之前检查下是否生成过就可以了,问他怎么样,他说on the right way。然后follow up,我直接开了一个长度为5的set数组Set<List<Integer>>[] sets来存放所有已经生成过的行,然后新生成的行都需要check一下是否已经生成过,生成过的话重新生成,面试官表示on the right way,因为他就想避免bias,即如果生成两次[1,2,3,4,5],如果只修改一个数字让它们不完全相同的话他说会产生bias,他想避免这种情况。
当时写的code:
int[][] generate() {
int[][] board = new int[5][5];
for(int i = 0 ; i < 5 ; i++) {
Set<Integer> visited = new HashSet<>();
for(int j = 0 ; j < 5; j++) {
boolean filled = false;
while(!filled) {
int val = random(i * 15 + 1, i * 15 + 15);
if(visited.add(val)) {
board[i][j] = val;
filled = true;
}
}
}
}
return board;
}
follow-up
和上面code差不多,只不过每次一行生成完了后去set检查下生成过没有