二进制之和
问题描述
小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。
问题分析
- 函数签名
- string addBinary(const string &a, const string &b):这个函数接收两个二进制字符串,并返回它们的十进制和作为字符串。
- 变量初始化
- string result;:用于存储二进制加法的中间和最终结果(在反转之前)。
- int carry = 0;:初始化进位为0。
- int i = a.size() - 1; 和 int j = b.size() - 1;:分别初始化两个字符串的索引,从末尾开始遍历。
- 循环逻辑
- while (i >= 0 || j >= 0 || carry):当任一字符串还有未处理的位或存在进位时,继续循环。
- 在循环内部,首先处理进位,然后根据索引 i 和 j 的有效性,将对应位置的字符转换为数字并加到 sum 上。
- 更新进位 carry 和结果字符串 result。
- 结果处理
- 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 是数组大小。
问题分析
- 参数
- vector& nums: 输入的整数数组。
- int k: 需要返回的前k个高频元素的数量。
- 局部变量
- unordered_map<int, int> freqMap: 用于存储每个数字的频率。
- vector<pair<int,int>> result: 存储哈希表中的键值对(数字及其频率)。
- stringstream ss: 用于构建最终返回的字符串。
- 逻辑流程
- 构建频率映射: 遍历输入数组 nums,使用 unordered_map 记录每个数字的频率。
- 存储映射到结果向量: 将 freqMap 中的每个键值对(数字及其频率)添加到 result 向量中。
- 排序: 使用 sort 函数对 result 向量进行排序,排序依据是元素的频率(降序)。
- 构建返回字符串: 遍历排序后的 result 向量的前 k 个元素,将它们转换为字符串并使用逗号分隔,存储在 stringstream 中。
- 返回结果: 将 stringstream 中的内容转换为字符串并返回。