[谷歌访谈]猜数字游戏

84 阅读5分钟

目录

公司标签:谷歌

你在为你的下一次编码面试做准备吗?如果你的答案是肯定的,那么这里有一个非常有趣的面试问题,可能会在你的面试中出现。

问题陈述

我们正在玩猜谜游戏。游戏内容如下。

我从1n 中挑选一个数字。你必须猜出我选的是哪个数字。每次你猜错了,我就会告诉你我选的数字是比你猜的高还是低。

你调用一个预定义的API int guess(int num),它会返回3种可能的结果。

  • -1 :我选的数字比你的猜测要低(即pick < num)。
  • 1: 我选的数字比你的猜测要高(即pick > num)。
  • 0: 我选的数字等于你的猜测(即pick == num)。

返回我挑选的数字。

⚠限制条件。

  • 1 <= n <= 231 - 1
  • 1 <= pick <= n

让我们来看看一些例子,以提高我们对这个问题的理解。

例子

例1:
输入:n = 10,pick = 6
输出。例子

2:
输入:n=1,选取=1
输出。例

3:
输入:n=20,选取=10


输出



。10例

4:
输入:n=10,选取=9


输出



。9












现在你已经理解了这个问题,让我们深入研究解决问题的方法。

前提是。如果你使用的是本地编辑器,请使用以下函数作为预定义的函数 "猜测"。

def guess(num):
    if pick < num:
        return -1
    elif pick > num:
        return 1
    else:
        return 0

方法1:使用线性搜索

**方法。**最简单的方法是应用线性搜索算法来猜测数字是高还是低。遍历每一个数字,如果它等于选取的数字,则返回该数字。

算法

  1. 将一个变量no初始化为0
  2. 检查每一个数字,直到no < = n,找出猜测的数字是否等于所选的数字
  3. 当预定义函数guess返回值为0时,返回当前数字。

**解决方案。**让我们看一下代码。

def guess_no(n, pick):  
    no = 0
    while no &lt;= n:
        if guess(no) == 0:
            return no
        no = no + 1

**测试案例分析。**让我们在我们的例子上运行这段代码。

# Example 1
n = 10
pick = 6
print(guess_no(n, pick))
# 6

# Example 2
n = 1
pick = 1
print(guess_no(n, pick))
# 1

# Example 3
n = 20
pick = 10
print(guess_no(n, pick))
# 10

# Example 4
n = 10
pick = 9
print(guess_no(n, pick))
# 9


复杂度分析最坏的情况下,所选的数字是最后猜到的数字。在这种情况下,这个方法的时间复杂性将是O(n)

方法2:使用除法和征服法

**的方法。**你可以使用这种方法来获得更好的时间复杂度。在这种方法中,你将把n分成两半,通过把变量 "mid "值传递给预定义的函数guess,在另一半中寻找 "guess"。因此,这种方法的想法是划分给定的范围,然后征服猜测的数字。

算法。

  1. 将低值和高值初始化为0和n+1
  2. 计算中间值为(低+高)/2,并将其传递给预定义的猜测函数。
  3. 如果返回的值是0,则返回0
  4. 如果返回值是1,将低值设置为中值+1
  5. 如果返回值为-1,则将高点设为中间值-1。

下图通过一个例子说明了上述算法的工作原理。

**解决方案。**让我们看一下代码。

def guess_no(n, pick):  
    low, high = 0, n 
    while low <= high:
        mid = (low + high) // 2
		
        if guess(mid) == 0:
            return mid
			
        else:
            if guess(mid) == 1:
                low = mid + 1
            else:
                high = mid1

测试案例分析。 让我们在我们的例子上运行这个代码。



# Example 1
n = 10
pick = 6
print(guess_no(n, pick))
# 6

# Example 2
n = 1
pick = 1
print(guess_no(n, pick))
# 1

# Example 3
n = 20
pick = 10
print(guess_no(n, pick))
# 10

# Example 4
n = 10
pick = 9
print(guess_no(n, pick))
# 9

好哇!它通过了所有的测试案例。

复杂度分析。

  • 时间复杂性:我们在这个方法中使用了分而治之的策略,因此,这个方法的时间复杂性将是O(logn)。
  • **空间复杂度:**这个方法的空间复杂度保持不变,即O(1)。

奖励方案。使用三元组搜索

**方法。**这个方法几乎与二元搜索相似,唯一的区别是我们在这个方法中把n ,分成三个部分。使用两个中间变量来猜测数字是高还是低。

算法。

  1. 将低和高初始化为0和n+1
  2. 计算mid1和mid2的值分别为low+(high-low)/3和high-(high-low)/3。
  3. 将这两个中间值传递给预定义的猜测函数。如果返回的值是0,则传给各自的中间值。
  4. 否则,更新低值和高值。

**解决方案。**让我们看一下代码。

def guess_no(low, high):  
    low, high = 0, n 

    while low <= high:
        mid1 = low + (high - low) // 3
        mid2 = high - (high - low) // 3
        if guess(mid1) == 0:
            return mid1
        if guess(mid2) == 0:
            return mid2
        if guess(mid1) + guess(mid2) == 0:
            low = mid1 + 1
            high = mid2 - 1
        elif guess(mid1) == -1:
            high = mid1 - 1
        else:
            low = mid2 + 1

**测试案例分析。**让我们在我们的例子上运行这段代码。

# Example 1
n = 10
pick = 6
print(guess_no(n, pick))
# 6

# Example 2
n = 1
pick = 1
print(guess_no(n, pick))
# 1

# Example 3
n = 20
pick = 10
print(guess_no(n, pick))
# 10

# Example 4
n = 10
pick = 9
print(guess_no(n, pick))
# 9

复杂度分析。

  • **时间复杂度:**三元搜索与二元搜索方法类似,时间复杂度为O(log3n) ~ O(logn)。
  • **空间复杂度:**该方法的空间复杂度保持不变,即O(1)。

结语

我希望你喜欢这个编码面试问题。请继续关注并订阅更多感兴趣的内容我希望你喜欢这个编码面试问题。请继续**关注并订阅更多**有趣的编码问题。

✍ 文章来源:ShubhamSayon和Rashi Agarwal


推荐。芬克斯特计算机科学学院

  • 在Fiverr和Upwork上最抢手的技能之一是网络刮削。请不要搞错。_以编程方式从网站中提取数据_是当今世界上由网络和远程工作塑造的一项重要的生活技能。
  • 那么,你想掌握使用Python的BeautifulSoup进行网络搜刮的艺术吗?
  • 如果答案是肯定的--本课程将带领你从网络刮削的初学者变成专家。

现在就**加入BeautifulSoup的网络抓取大师班**,明天就可以掌握它了

The post[Google Interview] Guess The Number Gamefirst appeared onFinxter.