本期给大家带来的是LeetCode的Top100热题中的技巧题目
一.[136] 只出现一次的数字(简单)

这道题其实很简单。我们最该想到的思路就是每当出现一个数字加上这个值,再次出现时减去这个值,最后留下的数便是答案。但是由于本题规定使用常量的额外空间,所以意味着我们需要用O(1)的空间复杂度来写这道题。我们可以初始化一个变量为0,然后和每个元素异或。

所以相同的数字会相互抵消,而留下来的就是只出现一次的数。
代码如下(不用转换为二进制数,直接在十进制数上操作即可):
class Solution:
def singleNumber(self, nums: List[int]) -> int:
length = len(nums)
result = 0
for i in range(length):
result = result^nums[i]
return result
二.[169] 只出现一次的数字(简单)

我们不妨直接尝试进阶版本:本题最大的题点在于这个元素的出现次数会大于n/2。那么我们就把这个元素当成“正派”,把剩下的所有元素当做“反派”(可以想象是复仇者联盟和灭霸hh)。那么只要出现反派,我们就对计数器count(初始为0)加1,而出现正派我们就加1,我们用计数器作为评判标准,当计数器为0时,我们把当前元素作为“候选者”,可以认为,当count为0时,意味着前面所有正派反派同归于尽了,所以当前的新元素作为新的开始。务必要注意的是,只有当count为0时,才会指定新的“候选者”。
代码如下:
class Solution:
def majorityElement(self, nums: List[int]) -> int:
candicator = 0
count = 0
length = len(nums)
for i in range(length):
if count == 0:
candicator = nums[i]
if nums[i] == candicator:
cou

最低0.47元/天 解锁文章
1591

被折叠的 条评论
为什么被折叠?



