【问题标题】:Leetcode #217 Contains Duplicate - what is wrong with my code?Leetcode #217 包含重复 - 我的代码有什么问题?
【发布时间】:2018-03-13 18:15:44
【问题描述】:

Problem 217: Contains Duplicate

问题描述:

给定一个整数数组,查找该数组是否包含任何重复项。 如果任何值至少出现两次,您的函数应该返回 true 在数组中,如果每个元素都是不同的,它应该返回 false。

我在 Python 中的解决方案:

class Solution:
    def containsDuplicate(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """

        from functools import reduce
        if len(nums) < 2:
            return False
        else:
            return bool(reduce(lambda x, y: not (bool(nums.count(x) == 1) and bool(nums.count(y) == 1)), nums))

我认为在nums 中对x 的每个判断nums.count(x) == 1 之间使用and 运算可以得出问题想要的答案的倒数,但似乎无法使其工作。

谁能告诉我为什么错了?例如,当输入为[1, 2, 3] 时,我得到的输出为True 而不是False

我的想法一开始是完全错误的,还是我在某个地方错误地执行了可行的实施?

任何帮助将不胜感激。提前谢谢你。

【问题讨论】:

  • return len(set(nums)) != len(nums) 应该这样做 - 比你的要容易得多。
  • 是的,我在网上找到了一个更简单的,但仍然想知道如何让我的工作...... :(

标签: python-3.x


【解决方案1】:

reduce onyl 成对比较:

来自文档:

reduce(lambda x,y:x+y, [1,2,3,4,5]) ==  ((((1+2)+3)+4)+5)

您的 reduce 产生一个布尔值作为输出。应用于 [1,2,3,4,5] 这将导致

not (bool(nums.count(1) == 1) and bool(nums.count(2) == 1)), nums) = False
not (bool(nums.count(False) == 1) and bool(nums.count(3) == 1)), nums) = True 
not (bool(nums.count(True) == 1) and bool(nums.count(4) == 1)), nums) = True 
not (bool(nums.count(True) == 1) and bool(nums.count(5) == 1)), nums) = True 
           #        ^^^^^^ always 0 ==> so reduce is always True

reduce 只比较成对,因此它不适合手头的任务:[1,2,3,4,2]

def dupes3(nums):
    return sorted( nums.count(x) for x in nums)[-1] > 1  

def dupes2(nums):
    from collections import Counter 
    return Counter(nums).most_common()[0][1]>1

def dupes(nums): # imho easiest one
    return len(set(nums)) < len(nums)

【讨论】:

  • 那如果我把not放在外面呢:return not bool(reduce(lambda x, y: bool(nums.count(x) == 1) and bool(nums.count(y) == 1), nums))
  • @Zhengyan 你的 lambda 的结果仍然是一个布尔值,在下一步搜索的时候在你的列表中没有找到它,它会一直是 false。
  • 对不起,我仍然不明白为什么 return reduce(lambda x, y : x ^ y, nums) 对 Leetcode #136 Single Number 有效:“给定一个整数数组,除了一个之外,每个元素都会出现两次。找到那个。”跨度>
  • @Zhengyan ^ 是按位异或 - 它返回一个数字并且是可交换的。 6 ^9 ^6 ^9 = 0 只要一个数字出现两次,它就会在静止时突出。见leetcode.com/problems/single-number/discuss/42997/…。等几天,也许有人会帮助你为那个人提供一个有效的减少选项
  • 在查看了reduce 的工作原理后,我终于理解了这两个问题之间的区别(它使用前两个元素的结果和第三个元素的结果,我的前两个元素的结果是布尔值,当然不在列表中)...再次感谢您的耐心等待,您对我今天的困惑确实有很大帮助!
【解决方案2】:
class Solution(object):
    def containsDuplicate(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        if len(set(nums)) == len(nums):
            return False
        return True

                

【讨论】:

  • 虽然这段代码可以解决问题,但它不能回答问题出在哪里。更好的including an explanation 解决问题的方式和原因将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
猜你喜欢
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多