AI练题刷题总结 | 豆包MarsCode AI刷题

29 阅读5分钟

问题一

问题描述

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。除了一个数字之外,所有的数字都恰好出现了两次。需要找到一个算法,以 O(n) 的时间复杂度找出那个没有配对的独特数字。

思路分析

要解决这个问题,我们可以利用异或(XOR)操作的性质。异或操作具有以下特点:

  1. 对任何数进行异或操作两次会得到原始数(例如,(a \oplus a = 0))。
  2. 对任何数进行异或操作一次,然后再与0进行异或操作,会得到原始数(例如,(a \oplus 0 = a))。
  3. 异或操作是可交换的,即 (a \oplus b = b \oplus a)。

由于除了一个数字之外,所有数字都出现了两次,我们可以将所有数字进行异或操作。成对的数字在异或操作中会相互抵消,结果为0,而那个只出现一次的数字在异或操作后将保留下来。

解题步骤

  1. 初始化一个变量 unique 为0。
  2. 遍历输入数组 cards 中的每个数字。
  3. unique 与当前数字进行异或操作。
  4. 遍历结束后,unique 将包含那个没有配对的独特数字。

代码分析

def solution(inp):
    unique = 0
    for num in inp:
        unique ^= num
    return unique
  • 时间复杂度:O(n),其中 n 是班级的人数。我们只需要遍历一次数组。
  • 空间复杂度:O(1),我们只使用了一个额外的变量 unique 来存储结果。

做这个题目让我深刻体会到了异或操作的巧妙应用,以及在算法设计中寻找简单而高效解决方案的重要性。一开始可能会想到使用哈希表来记录每个数字的出现次数,但这种方法会消耗额外的空间。通过这个题目,我学会了如何利用数学性质(如异或的交换律和结合律)来简化问题,实现时间和空间的双重优化。这种解决问题的思路在很多算法和数据结构问题中都非常有用。

知识总结

这个问题展示了异或操作在解决特定问题时的强大能力。通过利用异或的性质,我们可以在一次遍历中找到独特的数字,而不需要使用额外的空间来存储每个数字的出现次数。这种方法既高效又节省空间,是解决此类问题的理想选择。

问题二

问题描述

给定一个数字字符串 s,该字符串可能包含小数点。任务是将这个数字字符串格式化为带有千分位逗号的格式,同时保留小数部分。如果数字字符串前面的0是无用的,也需要将它们去除。

思路分析

  1. 处理小数点:首先,我们需要确定数字字符串中是否有小数点,并据此分割整数部分和小数部分。
  2. 去除前导零:对于整数部分,我们需要去除前导零,但要注意如果整数部分全为零的情况,应保留一个零。
  3. 添加千分位逗号:使用Python的字符串格式化功能,将整数部分转换为带有千分位逗号的格式。
  4. 组合结果:最后,将格式化后的整数部分和小数部分重新组合,形成最终的格式化字符串。

解题步骤

  1. 检查输入字符串 s 中是否包含小数点,并相应地分割整数和小数部分。
  2. 使用 lstrip('0') 方法去除整数部分的前导零,并检查是否需要保留一个零。
  3. 使用 {:,} 格式化整数部分,自动添加千分位逗号。
  4. 根据是否存在小数部分,将整数部分和小数部分组合,形成最终的格式化字符串。

代码分析

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字符串格式化的强大和便捷。以前我可能会尝试手动插入逗号,但使用 {:,} 格式化后,代码变得更加简洁和高效。这也提醒我在面对问题时,应该寻找语言提供的内置功能,这些功能往往是经过优化的,能够提高代码的执行效率和可读性。此外,处理特殊情况(如全零的整数部分)也是编写健壮代码的一个重要方面。