查找第二个匹配项具有最小索引

时间:2017-07-15 03:33:16

标签: python algorithm python-2.7 dictionary data-structures

这是关于codefights的问题:

  

给定一个数组a,它只包含1到1之间的数字   a.length,找到第二个的第一个重复数字   发生具有最小指数。换句话说,如果还有更多   超过1个重复的数字,返回第二个数字   出现的索引小于另一个出现的索引   号码确实。

我一直在努力弄清楚如何在python中完成这个。我不确定我是否在正确的道路上,如果我是,我似乎无法弄清楚如何从我的字典中找到特定值后访问我的索引字典。我想在我的d字典中获取大于1的所有值,然后从索引中获取这些值,然后索引中较小的值将是答案。

如果我完全错了,请告诉我。

def firstDuplicate(a):
    d = {}
    index = {}

    for i in a:
        if i in d:
            d[i] += 1
        else:
            d[i] = 1

    for i,e in enumerate(a):
        if e in d:
            index[e] = i
        else:
            index[e] = i

    for key,val in d.items():
        if val > 1:

6 个答案:

答案 0 :(得分:9)

嗯......简单方法有什么问题?

def firstDuplicate(a):

   aset = set()
   for i in a:
       if i in aset:
           return i
       else:   
           aset.add(i)

print(firstDuplicate([7,4,5,6,4,6,3]))  

字典版:

adict = {}
for i in a:
   if i in adict:
       return i
   else:   
       adict[i] = 1   

答案 1 :(得分:2)

我认为您可以尝试使用索引技术。由于您提到数字在1到a.length的范围内,您可以从列表中检索该元素,转到索引l[i]并将该元素更改为-l[l[i]],即

l[l[i]] = -1 * l[l[i]]

执行此操作时,如果遇到负值,则返回此索引处存在的元素的绝对值。如果您在实施此问题时遇到问题,请告诉我。这将是代码:(之前忘了提及):

l = [7,4,5,6,4,2,3]
found = 0
for i in range (0 , 6):
    item = abs(l[i])
    if(l[item - 1] > 0):
        l[item - 1] = -1 * l[item - 1]
    else:
        found = abs(l[i])
        break    
print (found)


output : 4

时间复杂度:O(n)

空间:O(1)

答案 2 :(得分:1)

您的第二个for循环对ifelse条件执行相同操作,让我们更改for循环,也就是说,不需要存储较少的元素比两次出现,所以让我们也添加这个条件。这里的第二个循环是,使用列表理解,它将所有出现的元素存储在列表中(Famous solution),然后我们将其存储在indexdic中。最后,打印两个词典,看看它们的样子:

def firstDuplicate(a):
    d = {}
    indexdic = {}

    for element in a:
        if a.count(element) > 1:
            if element in d:
                d[element] += 1
            else:
                d[element] = 1

    for key in d:
        indexdic[key] = [i for i, x in enumerate(a) if x == key]

    print('d: ', d)
    print('indexdic: ', indexdic)

运行此:

>>> firstDuplicate(['a','b','c','a','d','d','b'])
d:  {'a': 2, 'd': 2, 'b': 2}
indexdic:  {'a': [0, 3], 'd': [4, 5], 'b': [1, 6]}

现在在这个提示之后,你需要处理索引值所需的操作以获得你想要的输出,我会让你解决这个问题,这毕竟是一个练习。如果没有很好地描述任何步骤,请告诉我。

答案 3 :(得分:0)

当我在另一篇文章中红色时,键是使用字典。这是python 3的解决方案。索引是数字,因此你会知道你之前是否看过它。

 def firstDuplicate(a):
    oldies={}
    notfound=True
    for i in range(len(a)):
        try:
            if oldies[a[i]]==a[i]:
                notfound=False
                return a[i]     
        except:
            oldies[a[i]]=a[i]
    if notfound:
        return -1    

答案 4 :(得分:0)

def firstDuplicate(a):
lst = list()
x=-1
for i in a:
    if i in lst:
        x = i
        break
    else:
       lst.append(i)
return(x)

这个答案解决了20/22输入。 Codefights提供超出时间限制的错误。

答案 5 :(得分:0)

为了更快的结果,我们需要使用 set 而不是 list。

def first_duplicate(arr):
        uniques = set()
        for item in arr:
            if item in uniques:
                return item
            else:
                uniques.add(item)
    
        return -1