[英]Given a non-empty array of integers nums, every element appears twice except for one. Find that single one
[英]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.