猜数字

标签: 数组

难度: Easy

小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?

输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guessanswer的长度都等于3。

 

示例 1:

输入:guess = [1,2,3], answer = [1,2,3]
输出:3
解释:小A 每次都猜对了。

示例 2:

输入:guess = [2,2,3], answer = [3,2,1]
输出:1
解释:小A 只猜对了第二次。

 

限制:

  1. guess 的长度 = 3
  2. answer 的长度 = 3
  3. guess 的元素取值为 {1, 2, 3} 之一。
  4. answer 的元素取值为 {1, 2, 3} 之一。

Submission

运行时间: 18 ms

内存: 16.0 MB

class Solution:
    def game(self, guess: List[int], answer: List[int]) -> int:
        sum=0
        for i in range(3):
            if(guess[i]==answer[i]):
                sum=sum+1
        return sum
  

Explain

题解的核心思路是通过一个for循环遍历guess和answer数组的每一个元素,然后比较相同位置的两个元素是否相等。如果相等,说明小A在这次猜测中猜对了小B的数字,因此将计数器sum加1。最终,sum的值即为小A猜对的次数。循环结束后,返回sum的值。

时间复杂度: O(1)

空间复杂度: O(1)

class Solution:
    def game(self, guess: List[int], answer: List[int]) -> int:
        sum = 0  # 初始化匹配计数为0
        for i in range(3):  # 循环遍历每个位置
            if(guess[i] == answer[i]):  # 如果在位置i上的猜测和答案匹配
                sum += 1  # 增加匹配计数
        return sum  # 返回总的匹配次数

Explore

在这个特定的问题中,由于数组长度固定为3,直接比较`guess[i]`与`answer[i]`是最直接且有效的方法。考虑到数组非常短,使用循环进行逐项比较的开销非常小。在数组长度固定且短的情况下,不存在有效的方法来进一步减少比较的次数,因为每个元素都需要被检查是否相等。如果数组很长或者元素比较复杂时,可以考虑优化算法,比如使用哈希表或排序来减少比较次数,但在这种情况下,这些方法会增加不必要的复杂性和运行时间。

确实,使用`sum`作为变量名在Python中是不推荐的做法,因为它与内置函数`sum()`重名,这可能会导致在更复杂的代码环境中产生混淆或错误。更好的命名选择可以是`count`或`match_count`,这样的命名更具描述性,可以清楚地表示这个变量是用来计数匹配次数的。

对于长度固定为3的数组,使用硬编码(即直接比较`guess[0]`与`answer[0]`,`guess[1]`与`answer[1]`,`guess[2]`与`answer[2]`)是一个可行的替代方案。这种方法的优点是简化了代码,可能在某些情况下提高执行效率,因为省去了循环的开销。然而,缺点是降低了代码的可扩展性和可读性。如果未来游戏规则改变,比如数组长度变为4或更多,那么硬编码需要进行较大的修改,而使用循环则只需简单调整循环条件。因此,使用循环更具灵活性和可维护性。