題目描述:
在乙個長度為n的陣列裡的所有數字都在0~n-1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。
答案:
# 方法一:借助輔助空間,輸出全部重複的數字
import numpy as np
array = np.array([2,3,1,0,2,5,3,3])
def repeat(array):
b =
length = len(array)
for i in range(length):
if array[i] in b:
# 返回已經存在的值
yield array[i]
c = set(repeat(array))
print(c) #
# 輸出重複數字重複的次數
# c1 = list(repeat(array))
# for i in c:
# print(c1.count(i))
# 方法二:對原陣列排序,遍歷排序後的陣列
import numpy as np
array = np.array([2,3,1,0,2,5,3])
def repeat(array):
length = len(array)
for i in range(length):
for j in range(i+1,length):
if array[j]
# 方法三:牛客網可通過**
'''從頭到尾依次掃瞄這個陣列中的每個數字。當掃瞄到下標為i的數字時,首先比較
這個數字(用m表示)是不是等於i。如果是,則接著掃瞄下乙個數字;如果不是,
則再拿它和第m個數字進行比較。如果它和第m個數字相等,就找到了乙個重複的數
字(該數字在下標i和m的位置都出現了);如果它和第m個數字不相等,就把第i個
數字和第m個數字交換,把m放到屬於它的位置。接下來重複這個比較、交換的過程,
直到我們發現乙個重複的數字。
'''# -*- coding:utf-8 -*-
class solution:
def duplicate(self, numbers, duplication):
length = len(numbers)
if length == none:
return false
for index in range(length):
if numbers[index]<0 or numbers[index]>length-1:
return false
for index in range(length):
while index != numbers[index]:
if numbers[index] == numbers[numbers[index]]:#不同位置有相同值
duplication[0] = numbers[index]
return true
tmp = numbers[index]
numbers[index] = numbers[tmp]
numbers[tmp] = tmp
return false
#方法四
import collections
def repeat(numbers):
c = collections.counter(numbers)
for k,v in c.items():
if v>1:
return k
numbers = [1,1,1,2,2,3,4]
print(repeat(numbers))
題目變形:
在乙個長度為n+1的陣列裡的所有數字都在1~n的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但是不能修改輸入的陣列。例如,如果輸入長度為8的陣列,那麼對應的輸出是重複的數字2或者3。
'''
我們把從1~n的數字從中間的數字m分為兩部分,前面一半為1~m,
後面一半為m+1~n。如果1~m的數字的數目等於m,則不能直接判斷
這一半區間是否包含重複的數字,反之,如果大於m,那麼這一半
的區間一定包含重複的數字;如果小於m,另一半m+1~n的區間裡
一定包含重複的數字。接下來,我們可以繼續把包含重複的數字
的區間一分為二,直到找到乙個重複的數字。這個過程和二分查詢
演算法很相似,只是多了一步統計區間裡數字的數目。
二分查詢物件序列為1~n的有序序列,如題目中例子對應的二分查詢
序列為'''
# 統計一定範圍內有序序列元素在輸入陣列中出現的次數
def countrange(numbers,start,end):
if numbers == :
return 0
count = 0
length = len(numbers)
for i in range(length):
if numbers[i]>=start and numbers[i]<=end:
count+=1
return count
def repeat(numbers):
if numbers == :
return -1
length = len(numbers)
start = 1
end = length-1
while start <= end:
middle = (end+start)//2
count = countrange(numbers,start,middle)
if end == start:
if count>1:
return start
else:
break
if count>(middle-start+1):
end = middle
else:
start = middle+1
return -1
a = [2,3,5,4,3,2,6,7]
print(repeat(a))#3
上面的**針對0~n-1的陣列不適用,對其改進
def countrange(numbers,start,end):
if numbers == :
return 0
count = 0
length = len(numbers)
for i in range(length):
if numbers[i]>=start and numbers[i]<=end:
count+=1
return count
def repeat(numbers):
if numbers == :
return -1
length = len(numbers)
start = 0
flag = 0
end = length-1
while start <= end:
if flag == 0:
middle = start+((end-start)>>1)
count = countrange(numbers,start,middle)
if end == start:
if count>1:
return start
else:
break
if count>(middle-start+1):
end = middle
flag = 0
elif count == (middle - start + 1):
middle = middle - 1
if middle < start: #說明(start, middle)這個區間沒有重複的數
start = (start+end) // 2 + 1
flag = 0
else:
flag = 1
else:
start = middle+1
flag = 0
return -1
a = [1,7,2,5,6,1,3,3]
b = [2,3,5,4,3,2,6,7]
print(repeat(b))
陣列 陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。思路 python 實現 an highlighted block ...
陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道哪幾個 數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如 如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。include iostream using namespace ...
陣列中重複的數字
題目 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。思路 用雜湊表解決的時間複雜度和空間複雜度為o n 因為陣列中...