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

时间:2019-05-06 23:14:58

标签: python

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

我的代码没有为示例测试用例(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]

3 个答案:

答案 0 :(得分:1)

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

尤其是,这找不到第一个元素为奇数的情况。您确实尝试检查最后一个元素。

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

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]

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

答案 1 :(得分:1)

我弄清楚了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方法确定给定元素重复的总次数,如果只有一个元素仅出现一次,它将告诉您是哪个元素。我对您的设置进行了一些修改,以便有更多的数字可以运行。

Output of the above code

答案 2 :(得分:0)

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

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

您应该使用

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

那样,它不会跳过1