问题一
问题描述
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。除了一个数字之外,所有的数字都恰好出现了两次。需要找到一个算法,以 O(n) 的时间复杂度找出那个没有配对的独特数字。
思路分析
要解决这个问题,我们可以利用异或(XOR)操作的性质。异或操作具有以下特点:
- 对任何数进行异或操作两次会得到原始数(例如,(a \oplus a = 0))。
- 对任何数进行异或操作一次,然后再与0进行异或操作,会得到原始数(例如,(a \oplus 0 = a))。
- 异或操作是可交换的,即 (a \oplus b = b \oplus a)。
由于除了一个数字之外,所有数字都出现了两次,我们可以将所有数字进行异或操作。成对的数字在异或操作中会相互抵消,结果为0,而那个只出现一次的数字在异或操作后将保留下来。
解题步骤
- 初始化一个变量
unique为0。 - 遍历输入数组
cards中的每个数字。 - 对
unique与当前数字进行异或操作。 - 遍历结束后,
unique将包含那个没有配对的独特数字。
代码分析
def solution(inp):
unique = 0
for num in inp:
unique ^= num
return unique
- 时间复杂度:O(n),其中 n 是班级的人数。我们只需要遍历一次数组。
- 空间复杂度:O(1),我们只使用了一个额外的变量
unique来存储结果。
做这个题目让我深刻体会到了异或操作的巧妙应用,以及在算法设计中寻找简单而高效解决方案的重要性。一开始可能会想到使用哈希表来记录每个数字的出现次数,但这种方法会消耗额外的空间。通过这个题目,我学会了如何利用数学性质(如异或的交换律和结合律)来简化问题,实现时间和空间的双重优化。这种解决问题的思路在很多算法和数据结构问题中都非常有用。
知识总结
这个问题展示了异或操作在解决特定问题时的强大能力。通过利用异或的性质,我们可以在一次遍历中找到独特的数字,而不需要使用额外的空间来存储每个数字的出现次数。这种方法既高效又节省空间,是解决此类问题的理想选择。
问题二
问题描述
给定一个数字字符串 s,该字符串可能包含小数点。任务是将这个数字字符串格式化为带有千分位逗号的格式,同时保留小数部分。如果数字字符串前面的0是无用的,也需要将它们去除。
思路分析
- 处理小数点:首先,我们需要确定数字字符串中是否有小数点,并据此分割整数部分和小数部分。
- 去除前导零:对于整数部分,我们需要去除前导零,但要注意如果整数部分全为零的情况,应保留一个零。
- 添加千分位逗号:使用Python的字符串格式化功能,将整数部分转换为带有千分位逗号的格式。
- 组合结果:最后,将格式化后的整数部分和小数部分重新组合,形成最终的格式化字符串。
解题步骤
- 检查输入字符串
s中是否包含小数点,并相应地分割整数和小数部分。 - 使用
lstrip('0')方法去除整数部分的前导零,并检查是否需要保留一个零。 - 使用
{:,}格式化整数部分,自动添加千分位逗号。 - 根据是否存在小数部分,将整数部分和小数部分组合,形成最终的格式化字符串。
代码分析
def solution(s: str) -> str:
if '.' in s:
integer_part, decimal_part = s.split('.')
else:
integer_part, decimal_part = s, ''
integer_part = integer_part.lstrip('0')
if not integer_part:
integer_part = '0'
formatted_integer = '{:,}'.format(int(integer_part))
if decimal_part:
return '{}.{}'.format(formatted_integer, decimal_part)
else:
return formatted_integer
- 时间复杂度:O(n),其中 n 是字符串
s的长度。主要的时间消耗在字符串分割和小数点的检查上。 - 空间复杂度:O(n),由于使用了额外的字符串来存储格式化后的整数部分和小数部分。
知识总结
这个问题考察了字符串操作和格式化的知识,特别是如何使用Python的字符串格式化功能来简化代码。通过 {:,} 格式化,我们可以轻松地将整数部分转换为带有千分位逗号的格式,而不需要手动插入逗号。此外,问题还涉及到了字符串的分割、去除前导零和条件判断等基本操作。
自我感触
在解决这个问题时,我深刻体会到了Python字符串格式化的强大和便捷。以前我可能会尝试手动插入逗号,但使用 {:,} 格式化后,代码变得更加简洁和高效。这也提醒我在面对问题时,应该寻找语言提供的内置功能,这些功能往往是经过优化的,能够提高代码的执行效率和可读性。此外,处理特殊情况(如全零的整数部分)也是编写健壮代码的一个重要方面。