小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?
输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guess和answer的长度都等于3。
示例 1:
输入:guess = [1,2,3], answer = [1,2,3]
输出:3
解释:小A 每次都猜对了。
示例 2:
输入:guess = [2,2,3], answer = [3,2,1]
输出:1
解释:小A 只猜对了第二次。
限制:
guess的长度 = 3
answer的长度 = 3
guess的元素取值为 {1, 2, 3} 之一。
answer的元素取值为 {1, 2, 3} 之一。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/guess-numbers
这种方法是最普通最小白的方法,只要学过python的人写出来应该都不成问题。
class Solution:
def game(self, guess: List[int], answer: List[int]) -> int:
count = 0
for i in range(len(guess)):
if guess[i] == answer [i]:
count = count + 1
return count
时间复杂度:O(N),线性遍历
空间复杂度:O(N),count需要申请内存。
执行用时 :36 ms,击败了69.76%的用户
内存消耗 :13.6 MB,击败了5.26%的用户
为了简洁可以这样修改:
class Solution:
def game(self, guess: List[int], answer: List[int]) -> int:
return len([guess[i] for i in range(len(guess)) if guess[i] == answer [i]])
class Solution:
def game(self, guess: List[int], answer: List[int]) -> int:
return sum([guess[i]==answer[i] for i in range(len(guess))])
这两和上面那种简单写法本质上并没有什么区别,提高了一些执行时间。
执行用时 :36 ms,击败了70.18%的用户
内存消耗 :13.6 MB,击败了5.26%的用户
第二种改进方法中需要注意的是:
type(guess[i]==answer[i] for i in range(len(guess)))
通过这里我们可以看到得到的是generator类型的,因此我在外面加上了[],将其变为list类型,再计算其中布尔值为1的总数。
也可以不加[],sum(guess[i]==answer[i] for i in range(len(guess)))
,直接对其进行求和,但我试了下,变成列表的执行用时会比较少~
以下是查看题解的收获:
return [i==j for i,j in zip(guess,answer)].count(True)
zip()函数:
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
count()方法:
count() 方法用于:
1.统计字符串里某个字符出现的次数,可选参数为搜索的开始与结束位置。语法:str.count(sub, start= 0,end=len(string))
2.统计list中某元素出现的次数。语法:list.count(obj)