- 一个数组存有N+1个自然数,其中包含有N个不同的自然数,从中筛选出重复的自然数
法1:
#用新的字典存储元素和元素对应的个数
def findDup(array):
if array == None:
return -1
else:
lens = len(array)
h = dict()
i =0
while i < lens-1:
h[i] = 0
i+=1
j = 0
while j<lens:
if h[array[j]-1] == 0:
h[array[j]-1] = 1
else:
return array[j]
j += 1
return -1
法2:
#累计求和法
def findDup(array):
lens = len(array)
num1 = 0
num2 = 0
for i in range(lens):
num1 += array[i]
num2 = i+1+num2
num2 = num2-i-1
return(num1-num2)
法3:
#异或法:任何相同的数异或结果为0,不同的元素异或结果不为0,异或运算满足交换律,结合律
def FindDup(array):
if array == None:
return -1
else:
lens = len(array)
reult = 0
for i in range(lens):
result ^=array[i]
result ^=(i+1)
return(result^(i+1))
法4:
#数据映射法:每个元素看作数组的下标都可以对应数组的某个元素,当有重复元素时,它们作为下标会对应同一个元素
#从第一个元素开始,用一个标量记住该元素作为下标去寻找下一个元素,在把这个元素用它的相反数代替,那么当下一个元素为负值时
#证明这个元素之前被指向过,即指向它的上一个元素是重复的元素
def FindDup1(array):
a = 0
while array[a]>0:
array[a] = -array[a]
a = -array[a]
return a
- 找出数组当中的最大最小元素
#找出数组的最大元素,算法时间长度为N+1(N为奇数),N(N为偶数)
def FindMM(array):
for i in range(0,len(array),2):
if i+1 == len(array):
array.append(array[i])
elif array[i] > array[i+1]:
tmp = array[i]
array[i] = array[i+1]
array[i+1] = tmp
minone = array[0]
maxone = array[1]
for j in range(2,len(array)-1,2):
if array[j] < minone:
minone = array[j]
if array[j+1] > maxone:
maxone = array[j]
return minone, maxone