剑指offer(第二版)读书笔记以及编程题目python版答案(一)
github地址:https://github.com/ciecus/leetcode_answers/tree/master/jianzhi_offer
题目一:找出数组中重复的数字
书P39
github代码名称:t1_duplicated_numbers.py
在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3.
解题思路
思路一:先排序,排序的时间复杂度为O(nlogn),然后从头到尾扫描 思路二:利用哈希表,字典结构,时间复杂度O(n),空间复杂度O(n) 思路三【比较复杂】:数组中的数字都在0~n-1的范围内。如果这个数字中没有重复的数字,排序之后数字i将出现在下标为i的位置。 所以可以从头到尾扫描这个数组的每个数字,当扫描到下标为i的数字时,首先比较这个数字是不是等于i,如果不是就拿它和第m个数字进行比较。如果它和m个数字相等就找到了一个重复数字。如果和第m个数字不想等,就和第m个数字交换。【太复杂了,暂缓】
测试用例
(1)长度为n的数组里包含一个或者多个重复的数字。
(2)数组中不包含重复的数字
(3)无效测试用例(输入空指针:长度为n的数组中包含0~n-1之外的数字)
==输入格式 == 数组长度n 输入数组 长度为n的列表 例如: 3 1 2 2
代码
方法一:
import sys
def duplicated_number_1(n,values):
if (len(values) != n) |(len(values)==0):
print('the wrong input')
else:
values.sort()
dup_list = []
for i in range(n-1):
if values[i] == values[i+1]:
dup_list.append(values[i])
dup_list = set(dup_list)
if len(dup_list)>0:
string = ''
for dup in dup_list:
string +=