我需要从一个非空整数数组中找到一个元素(每个元素出现两次,除了一个,我必须找到一个)。
我的代码没有为示例测试用例(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]
答案 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方法确定给定元素重复的总次数,如果只有一个元素仅出现一次,它将告诉您是哪个元素。我对您的设置进行了一些修改,以便有更多的数字可以运行。
答案 2 :(得分:0)
问题似乎在索引中。数组和列表的索引为零,并且由于已排序,因此数组和列表应排在第一。这意味着不要使用:
对于范围在(1,len(nums)-1)中的i:
您应该使用
对于范围在(0,len(nums)-1)中的i:
那样,它不会跳过1