【问题标题】:Google foobar minion labor shifts challenge谷歌 foobar minion 劳动力转移挑战
【发布时间】:2017-08-14 17:59:37
【问题描述】:

我有一个 Google foobar 挑战:

编写一个名为 answer(data, n) 的函数,它接收一个少于 100 个整数和一个数字 n 的列表,并返回相同的列表,但将所有出现超过 n 次的数字完全删除。返回的列表应保持与原始列表相同的顺序 - 您不想混淆那些精心计划的轮班轮换!例如,如果 data 是 [5, 10, 15, 10, 7] 并且 n 是 1,则 answer(data, n) 将返回列表 [5, 15, 7] 因为 10 出现了两次,因此从完整列出。

这就是我的回答:

def​ ​answer(data=[],​ ​n=0):
​ ​​ ​​ ​​ ​for​ ​id​ ​in​ ​data:
​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​num​ ​=​ ​data.count(id)
​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​if​ ​num​ ​>​ ​n:
​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​for​ ​i​ ​in​ ​data:
​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​if​ ​i​ ​==​ ​id:
​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​data.remove​ ​(id)
​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​else:
​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​continue
​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​else:
​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​continue
​ ​​ ​​ ​​ ​return​ ​data

但它没有通过测试。

【问题讨论】:

  • 不清楚你的问题是什么,实际上这里没有问题,只是你的解决方案。您可以更新它以包含它吗?
  • 您的算法具有O(N^3) 复杂度。这对于像 Google FooBar 这样的编程挑战来说是可怕的,大数据输入的测试可能会超时。试试别的,这可以在O(N^2)(也许O(N)?)。

标签: python python-2.7 list


【解决方案1】:

更短

def​ ​solution(data,​ ​n):​
    return [x for x in data if data.count(x) <= n]

【讨论】:

    【解决方案2】:

    这是一个老问题,但尚未得到正确答案。在研究复杂性之前,您的答案是不正确的。当你想修改循环所依赖的数据结构时,你必须小心。你的情况

    for i in data:
      if i == _id:
        data.remove(_id)
      else:
        continue
    

    在所有情况下都不会从“data”中删除“id”,因为您在整个过程中更改了“data”的长度,并且在执行此操作时会跳过“data”中出现的“id”。相反,您可以做的是将“id”的出现索引存储在第一个 for 循环中,然后在第二个“for 循环”中以相反的顺序删除它们。 在您的算法中,上述错误发生了两次(在两个“for 循环”中)。

    【讨论】:

    • 测试用例失败数据 =[1, 2, 2, 3, 3, 3, 4, 5, 5],n=1
    • @Ajithlal 提供的代码是如何不做的问题
    【解决方案3】:
    def​ ​answer(data=[],​ ​n=0):
        d={}
        for i in data:
            if i not in d:
                d[i] = 1
            else:
                d[i] = d[i]+1
    
        target=[]
        for i in d.keys():
            if d[i] > n:
                target.append(i) #get those numbers appear counts more than n
    
        result=[x for x in data if x not in target]
        return result
    

    【讨论】:

      【解决方案4】:

      我不知道这是否是最好的方法。但我已经颠倒了清单来做到这一点。我的代码如下:

      def solution(data, n):
          # Your code here
          data.reverse()
          for val in data:
              num=data.count(val)
              if(num>n):
                  for i in range(num):
                    data.remove(val)
              data.reverse()
              return(data)
      

      【讨论】:

        【解决方案5】:

        我最近遇到了这个问题,发现必须满足特定条件,例如如果没有匹配的总数等于 n,则返回整个列表。我是这样想的:

        def answer(data, n):
            #Append all match count cases in data to bl and eliminate duplicates.
            #For example [5, 10, 15, 10, 7], n = 2, bl = [10, 10]. The function set() 
            #will remove the duplicates.
            bl = list(set(x for x in data if data.count(x) == n))
            
            #Returns a statement if the list has more than 100 integers within.
            if len(data) > 100:
                return "\nToo many data integers! Data must be below 100 integers."
            #Returns empty list if n = 0.
            if n == 0:
               return bl
            
            #Return list if duplicates were found, otherwise return the original list.
            if bl:
                return bl
            else:
                return data
        

        输入:

        answer([0, 2, 2, 1, 1, 3, 3, 3, 4, 5, 5], 2)
        

        输出:

        [1, 2, 5]
                
        

        【讨论】:

          【解决方案6】:
          def main():
              data = [2, 3, 2, 5, 6, 2, 5, 1, 8, 9, 9, -9]
              n = 3
              res = answer(data, n)
              print(res)
          
          def answer(data, n):
              store = []
              for x in range(len(data)):
                  count = 0
                  for y in data:
                      if y == data[x]:
                          count += 1
                  if count > n:
                      if data[x] not in store:
                          store.append(data[x])
          
              for z in store:
                  for r in reversed(range(len(data))):
                      if data[r] == z:
                          data.pop(r)
              return data
          
          main()
          

          【讨论】:

            【解决方案7】:

            这是我的解决方案 - 不会遍历重复的步骤

            def solution(data, n):
                flag = True
                counter = 0
                length = len(data)
                while flag:
                    repeats = data.count(data[counter])
                    if repeats > n:
                        data = [i for i in data if i != data[counter]]
                        length = length - repeats
                        counter = 0
                    else:
                        counter = counter + 1
                    if counter == length:
                        flag = False
                        print(','.join(map(str,data)))
                        break         
                        
            

            【讨论】:

              【解决方案8】:

              您可以通过在一行中使用列表推导来回答这个问题(对于较大的数据集不是最佳选择):

              def answer(data, n):
                  return [x for x in data if x not in [y for y in set(data) if data.count(y) > n]]
              

              正常方式:

              def answer(data, n):
                  data_set = set(data)
                  for d in data_set:
                      if data.count(d) > n:
                          data = filter(lambda a: a != d, data)
                  return data
              

              【讨论】:

                【解决方案9】:

                测试用例失败数据 =[1, 2, 2, 3, 3, 3, 4, 5, 5],n=1

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-10-19
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-09-11
                  • 1970-01-01
                  相关资源
                  最近更新 更多