airbnb电面

前一阵面的,现在有时间贴出来。。。

要猜出一四位数字。

例子:
# correct code: 3264
# GUESS 1111 => 0 0 (no correct digits)
# GUESS 1214 => 2 0 (digits 2 and 4 are correct and on correct position)
# GUESS 6111 => 0 1 (digit 6 is present, but on a different position)
# GUESS 6211 => 1 1 (digit 2 is not counted towards the second count!)

写的时候要连到一个server上。

# START\n
# GUESS 1111\n => 0 0
# etc......

没看到过面经,几经提示答出来了。隔天说过了。

补充内容 (2017-8-22 18:46):
这个和bull and cow不一样。例子是server的回复。你的目标是要根据这个回复来猜出原数字是什么。你可以设计要怎么猜。

1111是一次,这个返回结果需要存下来。
最差的结果是Target是6666.
1111 → “0 0”

2111 → “0 0”
3111 → “0 0”
4111 → “0 0”
5111 → “0 0”
这五次能确定第一位是6

1211 → “0 0”
1311 → “0 0”
1411 → “0 0”
1511 → “0 0”
这四次能确定第二位是6

1121 → “0 0”
1131 → “0 0”
1141 → “0 0”
1151 → “0 0”
这四次能确定第三位是6

1112 → “0 0”
1113 → “0 0”
1114 → “0 0”
1115 → “0 0”
这四次能确定第四位是6

17次,就找出结果。还不明白的话就把我的代码贴到IDE里运debug一下。

补充内容 (2017-9-16 00:21):
这题目的意思是每一位上的数字是1 ~ 6,而不是说这个数字的聚会范围是1111 ~ 6666

感觉更好的方法是初始candidates = {0, 1, 2, 3, 4,…, 9} (用priorityqueue可能比较方便写),第一轮当然遍历0000, 1111, 2222… 并且几下每组对应的返回值(a, b), 然后cnt = a + b,同时 candidates删除(a = 0, b = 0)的元素,priorityqueue以cnt从小到大排序。

猜的话初始XXXX表示四个位置全部available,可以用candidates外的元素作为初始值,以cnt最大的开始猜,比如cnt = 2, 就猜available位置放cnt最大digit的元素,遍历下去,AAXX, AXAX, AXXA…这样下去avaialble的位置就减少到4 - cnt, 依次进行,但是每次只在available的位置遍历,减小搜索空间,方法适用于n长的String.

你可以问面试官如果传除了1到6以外的数字行不行,不行的话,就1111,2111,3111,4111,5111这样传好了。按这贴子给的例子,标准答案“3264”的话,那当传“3111”时,得到的结果是“1 0”, 其他的结果都是“0 0”,所以第一位是“3”。然后传1211,1311,1411,1511,当传“1211”时得到的结果是“1 0”,其他都是“0 0”。接着传“1121,1131,1141,1151”,所有结果都是“0 0”, 那这一位就是“6”。最后依次传“1112,1113,1114,1115”,当传“1114”时得到“1 0”的结果,其余的都是“0 0”。

这道题有多种解法,最直接的解法是先猜"1111,2222,3333,4444,5555"看看这四个数字都是什么,之后找到这四个数字的permutation,一个一个去猜,直到全猜对。
还有一种猜法最多猜20次,1000,2000,3000,4000,5000,如果哪次返回了“1 0”,就说明第一位就是那个数字,如果每次都返回“1 0”,说明第一位是“6”。接着再猜"0100 0200 0300 0400 0500",同样道理找到第二位,第三位和第四位。

补充内容 (2017-9-4 09:34):
打错了,如果每次都返回“0 0”, 不是每次都返回“1 0”

好像LeetCode原题?

那一道哦?没做到。

bulls and cows

有人有思路吗?我想了很久没想出来。

谢谢您的回复!
请问这个正确的数字只包含1 - 6 这6种数字,不包含0和大于等于7的数字是吗?不然的话好像您说的第二种方法不好用啊。

我的方法是

猜0000,如果回来
1.是 (0,?) => 0 不存在。
2.是 (2,?)=> 猜1000,如果回来是(x,?),x!=2的话,第一位一定是0,再猜0100。。

搞定0后再猜1111,1211,1121,1112,

最差猜大约5+4*4=21次。