AI刷题问题分析6| 豆包MarsCode AI 刷题

34 阅读3分钟

二进制之和

问题描述

小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。

问题分析

  1. 函数签名
  • string addBinary(const string &a, const string &b):这个函数接收两个二进制字符串,并返回它们的十进制和作为字符串。
  1. 变量初始化
  • string result;:用于存储二进制加法的中间和最终结果(在反转之前)。
  • int carry = 0;:初始化进位为0。
  • int i = a.size() - 1; 和 int j = b.size() - 1;:分别初始化两个字符串的索引,从末尾开始遍历。
  1. 循环逻辑
  • while (i >= 0 || j >= 0 || carry):当任一字符串还有未处理的位或存在进位时,继续循环。
  • 在循环内部,首先处理进位,然后根据索引 i 和 j 的有效性,将对应位置的字符转换为数字并加到 sum 上。
  • 更新进位 carry 和结果字符串 result。
  1. 结果处理
  • reverse(result.begin(), result.end());:由于是从字符串末尾开始构建结果,因此最后需要反转字符串。
  • long long decimalSum = stoll(result, 0, 2);:将二进制字符串转换为十进制长整数。这一步实际上是多余的,因为题目要求返回的是十进制字符串,而不是长整数。
  • return to_string(decimalSum);:将十进制长整数转换回字符串并返回。由于前面的 stoll 转换是多余的,这一步也可以优化为直接返回 result 字符串(在反转之后)。

查找热点数据

问题描述

给你一个整数数组 nums 和一个整数 k,请你用一个字符串返回其中出现频率前 k 高的元素。请按升序排列。

你所设计算法的时间复杂度必须优于 O(n log n),其中 n 是数组大小。

问题分析

  1. 参数
  • vector& nums: 输入的整数数组。
  • int k: 需要返回的前k个高频元素的数量。
  1. 局部变量
  • unordered_map<int, int> freqMap: 用于存储每个数字的频率。
  • vector<pair<int,int>> result: 存储哈希表中的键值对(数字及其频率)。
  • stringstream ss: 用于构建最终返回的字符串。
  1. 逻辑流程
  • 构建频率映射: 遍历输入数组 nums,使用 unordered_map 记录每个数字的频率。
  • 存储映射到结果向量: 将 freqMap 中的每个键值对(数字及其频率)添加到 result 向量中。
  • 排序: 使用 sort 函数对 result 向量进行排序,排序依据是元素的频率(降序)。
  • 构建返回字符串: 遍历排序后的 result 向量的前 k 个元素,将它们转换为字符串并使用逗号分隔,存储在 stringstream 中。
  • 返回结果: 将 stringstream 中的内容转换为字符串并返回。