442. 数组中重复的数据 -中
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
示例:
输入:
[4,3,2,7,8,2,3,1]
输出:
[2,3]
方法一:collections模块的Counter类
class Solution:
def findDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
from collections import Counter
l = []
dic = Counter(nums)
for key, value in dic.items():
if value == 2:
l.append(key)
return l
方法二:set
class Solution:
def findDuplicates(self, nums):
l = []
s = set()
for i in nums:
if i in s:
l.append(i)
else:
s.add(i)
return l
延伸:collections.Counter类
- Counter 是一个有助于 hashable 对象计数的 dict 子类。元素-计数分别存储为字典的键和值,计数可以为任意整数,包括零和负数。
from collections import Counter
l = 'abcdab'
d = Counter(l) → d = Counter({'a': 2, 'b': 2, 'c': 1, 'd': 1})
287. 寻找重复数 -中
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
示例 1:
输入: [1,3,4,2,2]
输出: 2
示例 2:
输入: [3,1,3,4,2]
输出: 3
说明:
- 不能更改原数组(假设数组是只读的)。
- 只能使用额外的 O(1) 的空间。
- 时间复杂度小于 O(n2) 。
- 数组中只有一个重复的数字,但它可能不止重复出现一次。
方法一:
class Solution:
def findDuplicate(self, nums):
for i in range(len(nums)):
while nums[i] != i:
j = nums[i]
if j == nums[j]:
return j
else:
nums[i], nums[j] = nums[j], j
方法二:(借鉴)
class Solution:
def findDuplicate(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
slow = nums[0]
fast = nums[slow]
while fast != slow:
slow = nums[slow]
fast = nums[nums[fast]]
fast = 0
while fast != slow:
slow = nums[slow]
fast = nums[fast]
return fast
448. 找到所有数组中消失的数字
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。
示例:
输入:
[4,3,2,7,8,2,3,1]
输出:
[5,6]
class Solution:
def findDisappearedNumbers(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
s = set(nums)
l = [i for i in range(1,len(nums)+1) if i not in s]
return l
136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = 0
for i in nums:
n ^= i
return n
说明: ^= 为异或运算,近似于加法,只是在两边有相同数时会抵减掉。
- 异或:也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
异或讲解参考:http://lijinma.com/blog/2014/05/29/amazing-xor/
905. 按奇偶排序数组
给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
示例:
输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。
提示:
1 <= A.length <= 5000
0 <= A[i] <= 5000
class Solution(object):
def sortArrayByParity(self, A):
"""
:type A: List[int]
:rtype: List[int]
"""
i, j = 0, len(A) - 1
while i < j:
if A[i] % 2 > A[j] % 2:
A[i], A[j] = A[j], A[i]
if A[i] % 2 == 0: i += 1
if A[j] % 2 == 1: j -= 1
return A
961. 重复 N 次的元素
在大小为 2N 的数组 A 中有 N+1 个不同的元素,其中有一个元素重复了 N 次。
返回重复了 N 次的那个元素。
示例 1:
输入:[1,2,3,3]
输出:3
示例 2:
输入:[2,1,2,5,3,2]
输出:2
示例 3:
输入:[5,1,5,2,5,3,5,4]
输出:5
提示:
- 4 <= A.length <= 10000
- 0 <= A[i] < 10000
- A.length 为偶数
class Solution:
def repeatedNTimes(self, A):
"""
:type A: List[int]
:rtype: int
"""
l = []
for i in A:
if i not in l:
l.append(i)
else:
return i