陣列中重複的數字

2021-08-10 19:53:34 字數 4299 閱讀 8952

題目描述:

在乙個長度為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 因為陣列中...