繁体   English   中英

从非空整数数组中查找单个元素,每个元素出现两次,除了一个

[英]Find single element from a non-empty array of integers, every element appears twice except for one

我需要从非空整数数组中查找单个元素(每个元素出现两次,除了一个,我必须找到一个)。

我的代码未给出示例测试用例(2,2,1)的期望结果。 理想情况下,它应返回1作为结果,但它将返回Null。 您能帮我了解一下这个问题吗?

def singleNumber(self, nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    nums.sort()
    for i in range(1,len(nums)-1):
        if i==len(nums)-1:
            if nums[i]!=nums[i-1]:
                return nums[i]
        if nums[i]!=nums[i+1] and nums[i]!=nums[i-1]:
            return nums[i]

您的比较逻辑有问题。 您的所有if语句都找不到奇数值。 结果,您的函数返回默认值None

特别是,这无法找到第一个元素为奇数的情况。 您确实尝试检查最后一个元素。

我建议您使用一些基本调试。 请参阅这个可爱的调试博客以获取帮助。 在这种情况下:

for i in range(1,len(nums)-1):
    print(i, nums[i-1:i+1])
    if i==len(nums)-1:
        print("End of list check")
        if nums[i]!=nums[i-1]:
            return nums[i] 

    print("Middle of list check")
    if nums[i]!=nums[i+1] and nums[i]!=nums[i-1]: 
        return nums[i]

请注意,有一种更简单,规范的方法来执行此操作:只需对列表进行迭代而不进行排序。 将所有元素异或。 配对的元素将互相抵消,剩下一个奇数元素。

我知道了Prune提到的XOR运算符。 如果检查结果

print(2^2^1^1^4^4^7)

它显示7。因此,如果将整个数组与XOR运算符(^)链接在一起,则最终结果将是未配对的数字。

我只是花了一些时间来做这个:

test_list = [2,2,1,3,3,4,6,7,7,6,0,0,4,1,16,9,9]

unpaired_number = test_list[0]
for element in range(1, len(test_list)):
    unpaired_number = unpaired_number^(test_list[element])

print(unpaired_number)

如果运行,上面的块将给出16。

先前的解决方案:

from collections import Counter

test_dict = dict(Counter([2,2,1,3,3,4,6,7,7,6,0,0,4]))

for element in test_dict:
    print(f"Number of appearances: {test_dict[element]} for the element {element}.")
    if (test_dict[element]==1):
        print(f"Unpaired element: {test_dict[element]}")

这是我的代码。

我试图避免根据以前的答案的评论进行排序。 Prune提到的XOR方法让我有些头疼

代码使用集合中的Counter方法确定给定元素重复的总次数,如果单个元素仅出现一次,它将告诉您是哪个元素。 我对您的设置进行了一些修改,以便有更多数字可以运行。

上面代码的输出

问题似乎在索引中。 数组和列表的索引为零,并且由于已排序,因此数组和列表应排在第一。 这意味着不要使用:

对于范围(1,len(nums)-1)中的i:

你应该使用

对于范围(0,len(nums)-1)中的i:

这样就不会跳过1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM