AI 刷题(五) | 豆包MarsCode AI刷题

151 阅读4分钟

模拟


找单独的数

问题描述

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。

要求:

  1. 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
  2. 尽量减少额外空间的使用,以体现你的算法优化能力。

测试样例

样例1:

输入:cards = [1, 1, 2, 2, 3, 3, 4, 5, 5]
输出:4
解释:拿到数字 4 的同学是唯一一个没有配对的。

样例2:

输入:cards = [0, 1, 0, 1, 2]
输出:2
解释:数字 2 只出现一次,是独特的卡片。

样例3:

输入:cards = [7, 3, 3, 7, 10]
输出:10
解释:10 是班级中唯一一个不重复的数字卡片。

约束条件

  • 1 ≤ cards.length ≤ 1001
  • 0 ≤ cards[i] ≤ 1000
  • 班级人数为奇数
  • 除了一个数字卡片只出现一次外,其余每个数字卡片都恰好出现两次

解题思路

该问题可以通过 位运算 中的 异或操作 来高效解决,原因是异或操作 a⊕a=0 且 a⊕0=a。对数组中所有数字进行异或操作后,成对的数字会互相抵消,仅剩下那个出现一次的数字

算法步骤

  • 初始化一个变量 unique = 0
  • 遍历数组中的每个数字,用 unique 对数字进行异或操作:unique ^= num
  • 遍历完成后,unique 的值就是那个只出现一次的数字。

代码

def solution(cards):
    unique = 0
    for card in cards:
        unique ^= card
    return unique

if __name__ == "__main__":
    # Add your test cases here

    print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4)
    print(solution([0, 1, 0, 1, 2]) == 2)
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

超市里的货物架调整

问题描述

在一个超市里,有一个包含 nn 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 nn 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。

作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:

  • n:货物架的格子数
  • m:顾客想要购买的商品种类数
  • s:货物架上商品的初始顺序
  • c:顾客想要购买的商品种类

测试样例

样例1:

输入:n = 3 ,m = 4 ,s = "abc" ,c = "abcd"
输出:3

样例2:

输入:n = 4 ,m = 2 ,s = "abbc" ,c = "bb"
输出:2

样例3:

输入:n = 5 ,m = 4 ,s = "bcdea" ,c = "abcd"
输出:4

解题思路

核心策略:

  1. 将货架上的商品和顾客需求分别统计为频次,利用这些频次来优化匹配。
  2. 按照顾客的需求依次匹配货架上的商品,将满足需求的商品从货架中移除。
  3. 统计成功匹配的商品数量。

算法步骤

  • 用两个字典分别统计货架上的商品频次和顾客需求的商品频次。
  • 遍历顾客需求字典,逐一匹配货架上的商品:
    • 如果某种商品既在需求中也在货架中,取两者频次的最小值作为成功出售的数量,并从货架库存中扣除相应数量。
  • 返回成功出售的商品总数。

代码

from collections import Counter
def solution(n: int, m: int, s: str, c: str) -> int:
    # 统计货架上的商品频次和顾客需求的频次
    shelf_count = Counter(s)
    customer_count = Counter(c)
    
    # 统计成功售出的商品数量
    sold = 0
    
    # 遍历顾客需求,尽可能满足
    for item, demand in customer_count.items():
        if item in shelf_count:
            sold += min(shelf_count[item], demand)
    
    return sold

if __name__ == '__main__':
    print(solution(3, 4, "abc", "abcd") == 3)
    print(solution(4, 2, "abbc", "bb") == 2)
    print(solution(5, 4, "bcdea", "abcd") == 4)
  • 时间复杂度:O(n+m)
  • 空间复杂度:O(1)