LeetcodeDAY2 LCP 01.猜数字 #100107

题目描述

小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)

你可能感兴趣的:(leetcode,leetcode,python)