【问题标题】:Given an array of integers, find and increment duplicate values with the lowest sum of total array in Python?给定一个整数数组,找到并增加Python中总数组总和最小的重复值?
【发布时间】:2019-04-26 14:11:42
【问题描述】:

给定一个数组 arr,我们希望它通过递增 arr 中的任何重复元素来使其唯一,从而使 arr 唯一元素的总和最小。换句话说,如果 arr 中的两个或多个元素不是唯一的,我们必须将重复元素的值增加到其他一些数字,这样 arr 由唯一元素组成,它们的总和等于一个小数字尽可能。

例如,如果 arr = [3, 2, 1, 2, 7],则 arr unique = [3, 2, 1, 4, 7] 及其元素之和的最小值为 3 + 2 + 1 + 4 + 7 = 17。

我的方法。没有执行

def inc_dup(a):
   i = 0
   while i < len(a):
      j = i + 1
      while j < len(a):
         if a[i] == a[j]:
            a[j] + 1
         else:
            j += 1
      i += 1

s = [3,2,4,5,4,3,6]
inc_dup(s)
print(s)
print(sum(s))

【问题讨论】:

    标签: python arrays list while-loop sum


    【解决方案1】:

    您可以遍历您的列表,跟踪所涵盖的项目以查找任何重复项并将其替换为可能的最小整数:

    import sys
    
    lst = [3, 2, 1, 2, 7]
    
    visited = []
    for i, x in enumerate(lst):
        if x in visited:
            lst[i] = next(a for a in range(1, sys.maxsize) if a not in visited)
            visited.append(lst[i])
        else:
            visited.append(x)
    
    print(lst)
    # [3, 2, 1, 4, 7]
    

    【讨论】:

      【解决方案2】:

      没有上面那么优雅,但是因为我在尝试这个问题时很开心所以发布了

      def incDup(list):
          dict = {}
          j = 0
          while j < len(list):
              if list[j] in dict: # if value has been seen, we keep increasing it
                  list[j] += 1
              else: # first time seeing value
                  dict[list[j]] = 1
                  j += 1
      
           print(list)
      
      incDup([3, 2, 1, 2, 7]) #[3, 2, 1, 4, 7]
      incDup([3, 2, 2, 7, 7]) #[3, 2, 4, 7, 8]
      

      【讨论】:

      • 对于[3, 2, 2, 7, 7],输出应为[3, 2, 1, 7, 4]
      • OP 的问题是如果有重复,我们必须增加重复值,但将总和保持在最低限度(不仅仅是增加到某个任意大的数字),因此您不能将 7 更改为 4
      • 我认为这是错误的措辞。 OP 可能意味着 replace 用尽可能小的数字重复;现在看起来很混乱。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      相关资源
      最近更新 更多