目录
1. 题目描述
2. 解题分析
2.1 解法1
2.2 解法2
3. 代码实现
1. 题目描述
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1: 输入:nums = [2,2,3,2] 输出:3
示例 2: 输入:nums = [0,1,0,1,0,1,99] 输出:99 ? 提示: 1 <= nums.length <= 3 * 10^4 -2^31 <= nums[i] <= 2^31 - 1 nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 ? 进阶:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/single-number-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
?
2. 解题分析
2.1 解法1
????????先对数组进行排序,然后按顺序遍历,找到一个跟前面和后面都不同的数就是结果。要注意头上一个数据和尾巴上那个数据的特殊处理。
2.2 解法2
? ? ? ?一个取巧的做法是用python中collections.Counter()。当然这个肯定不是出题者的本意。
3. 代码实现
import sys
import time
import random
import collections
from typing import List
class Solution:
def singleNumber(self, nums: List[int]) -> int:
nums.sort()
if len(nums) == 1:
return nums[0]
if nums[0] != nums[1]:
return nums[0]
if nums[-1] != nums[-2]:
return nums[-1]
k = 1
while k < len(nums)-1:
if nums[k] == nums[k-1]:
k += 1
continue
elif nums[k] == nums[k+1]:
k += 2
continue
else:
return nums[k]
def singleNumber2(self, nums: List[int]) -> int:
freq = collections.Counter(nums)
ans = [num for num, occ in freq.items() if occ == 1][0]
return ans
if __name__ == '__main__':
sln = Solution()
nums = [2]
print(nums, ' -> ', sln.singleNumber(nums))
print(nums, ' -> ', sln.singleNumber2(nums))
nums = [2,2,3,2]
print(nums, ' -> ', sln.singleNumber(nums))
print(nums, ' -> ', sln.singleNumber2(nums))
nums = [0,1,0,1,0,1,99]
print(nums, ' -> ', sln.singleNumber(nums))
print(nums, ' -> ', sln.singleNumber2(nums))
nums = [0,1,99,1,99,1,99]
print(nums, ' -> ', sln.singleNumber(nums))
print(nums, ' -> ', sln.singleNumber2(nums))
?
本系列总目录:笨牛慢耕的Leetcode解题笔记(动态更新。。。)https://chenxiaoyuan.blog.csdn.net/article/details/123040889
|