第一题
找出数组中重复的数字。
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
1字典 (哈希表
字典的创建
字典的添加
字典的键值对 值的判断
while
dic = {}
for i in nums:
dic[i] = 0
for i in nums:
dic[i] += 1
while dic[i] > 1:
return i
2 集合 (哈希表
参考大佬写的简洁明了
dic = set()
for num in nums:
if num in dic: return num
dic.add(num)
return -1
第二题
“统计一个数字在排序数组中出现的次数。”
if target not in nums:
return 0
if target in nums and len(nums) == 1:
return 1
dic = {}
for i in nums:
dic[i] = 0
for i in nums:
dic[i] += 1
while i > target:
return dic[i]+1
用这方法有缺陷,只能通过 36/88 的测试用例。
大佬说 排序题 最先想到的就应该是用二分查找
我回顾了一下二分查找的用法
循环条件 左小于右 + 返回 中间值
left = 0
right = len(nums)-1
while left <= right:
mid = (left + right) //2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
else:
return None #考虑特殊情况
此题的大佬写法
i, j = 0, len(nums)-1
while i <= j :
m = ( i + j ) // 2
if nums[m] <= target: i = m +1
else: j = m - 1
right = i
if j >= 0 and nums[j] != target: return 0
i = 0
while i <= j :
m = (i+j)//2
if nums[m] <= target: i = m + 1
else:
j = m - 1
left = j
return right - left -1
很奇怪的一点是,我的运行结果一直是0,测试用例18/88
试了好多次,反正奇奇怪怪的,不管了
最后用二分法做的这道题,“排序”和“二分”要绑定在一起。
大佬版的进阶写法是把重复的部分封装成一个helper的函数。
第三题
0~n-1中缺失的数字
输入: [0,1,3]
输出: 2
if 0 not in nums:
return 0
if len(nums)-1 not in nums:
return len(nums)-1
# 保证首尾都在
i = 0
j = len(nums)-1
while i <= j:
m = (i+j)//2
if m == nums[m]:
i = m+1
else:
j = m-1
return i #只能是i,不可以是j
我把首位情况去掉,竟然也通过了所有的测试用例,好吧,想了一下,其实首位有没有已经包含在下面的情况中了。