1.寻找独特数字卡片
一、问题描述
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。
二、思路解析
- 目标明确:给定一个包含整数的列表,其中除了一个数字仅出现一次外,其余数字都恰好出现两次,需要找出这个独特的数字。
- 利用异或特性:想到利用异或运算(
^)的特殊性质来解决问题。因为异或运算满足交换律和结合律,且相同的两个数异或结果为 0,0 与任何数异或等于该数本身。所以当对列表中的所有数字依次进行异或运算时,出现两次的数字会相互抵消,最终剩下的就是那个只出现一次的独特数字。
三、解题步骤
- 初始化变量:定义一个变量
unique,并将其初始值设为 0。这个变量将用于存储经过一系列异或运算后的结果,也就是最终要找的独特数字。 - 遍历列表:使用循环遍历输入的整数列表
inp中的每一个数字num。 - 执行异或运算:在每次循环中,将当前数字
num与unique进行异或运算,并将结果重新赋值给unique。即unique ^= num。通过不断地这样操作,列表中出现两次的数字会在异或过程中相互抵消。 - 返回结果:当遍历完整个列表后,此时
unique变量的值就是那个只出现一次的独特数字,将其返回作为函数的最终输出。
四、代码分析
(一)函数定义部分
def solution(inp):
unique = 0
for num in inp:
unique ^= num
return unique
def solution(inp)::定义了一个名为solution的函数,它接受一个参数inp,这个参数预期是一个包含整数的列表,函数的任务就是从这个列表中找出那个独特的数字。unique = 0:在函数内部,首先初始化了一个变量unique为 0。这是后续异或运算的起始值,利用了 0 与任何数异或等于该数本身的特性。
(二)循环遍历与异或运算部分
for num in inp:
unique ^= num
for num in inp::这是一个简单的for循环,用于遍历输入列表inp中的每一个元素。每次循环,当前元素会被赋值给变量num。unique ^= num:在循环内部,将当前的数字num与变量unique进行异或运算,并将结果重新赋值给unique。通过不断地在循环中执行这个操作,实现了对列表中所有数字的异或处理,使得出现两次的数字相互抵消。
()返回结果部分
return unique
- 当循环结束,也就是遍历完整个列表后,变量
unique中存储的就是那个只出现一次的独特数字,通过return语句将这个结果返回给函数的调用者。
(四)测试用例部分
test1 = [1, 1, 2, 2, 3, 3, 4, 5, 5]
test2 = [0, 1, 0, 1, 2]
print(solution(test1) == 4) # 输出: True
print(solution(test2) == 2) # 输出: True
- 首先定义了两个测试用例
test1和test2,它们分别是不同的整数列表,且都符合题目中除一个数字外其他数字都出现两次的条件。 - 然后通过调用
solution函数分别对这两个测试用例进行处理,并将函数返回的结果与预期的独特数字进行比较。通过print语句输出比较的结果,如果输出为True,说明函数在该测试用例上正确找到了独特数字,反之则说明函数可能存在问题。在给出的示例中,两个测试用例的输出都是True,表明函数solution在这两个测试用例上运行正确。
五、知识总结
(一)异或运算知识
- 异或运算(
^)是一种位运算,它对两个操作数的每一位进行比较操作。当对应的两位不同时,结果位为 1;当对应的两位相同时,结果位为 0。 - 异或运算具有交换律(
a ^ b = b ^ a)和结合律((a ^ b) ^ c = a ^ (b ^ c))。 - 相同的两个数进行异或运算结果为 0,即
a ^ a = 0;0 与任何数进行异或运算结果为该数本身,即0 ^ a = a。这些特性在解决本题这类找出唯一出现一次的元素的问题中非常有用。
(二)函数定义与调用知识
- 在 Python 中,通过
def关键字可以定义一个函数,函数可以接受参数,参数是函数内部处理的数据来源。在本题中,函数solution接受一个列表参数inp。 - 函数内部可以包含各种语句来实现特定的功能,如本题中的变量初始化、循环遍历、运算操作以及返回结果等。
- 定义好的函数可以通过函数名后面加上括号并传入相应的参数来进行调用,如在测试用例中调用
solution(test1)和solution(test2)。