一、压缩字符串
题目解析
题目给定一个字符 str,要求将字符串进行压缩。
压缩规则:
出现多次的字符压缩成 字符 + 数字;例如 aaa 压缩成 a3。如果字符值出现一次,1 不用写。
算法思路
这道题比较简单,直接模拟整个过程即可。
思路: 使用双指针遍历,统计字符和字符出现的次数。
i固定一个字符,j向后遍历找与i位置相同的字符。- 如果相同就继续向后遍历,直到
j位置与i位置的字符不相同。 j向后遍历结束,i位置字符出现的次数为j-i。- 如果
j-i > 1就在结果字符串中加入出现的次数;等于1则不用加次数。
代码实现
class Solution {
public:
string compressString(string param) {
string ret;
for (int i = 0; i < param.size(); ) {
int j = i + 1;
while (j < param.size() && param[j] == param[i]) j++;
ret += param[i];
if (j - i > 1) ret += to_string(j - i);
i = j;
}
return ret;
}
};
二、chika 和蜜柑
题目解析
chika 很喜欢吃蜜柑,每一个蜜柑有一定的甜度和酸度。
现在输入 n 表示蜜柑的个数,k 表示 chika 要吃 k 个蜜柑;然后依次输入每个蜜柑的酸度、每个蜜柑的甜度。
chika 想要甜度尽可能的大,如果存在甜度相等的情况,就让酸度尽可能小。
现在要我们求酸度和甜度(甜度尽可能大,酸度尽可能小)。
算法思路
对于这道题,是一道 TopK 问题。
TopK 问题简单来说就是在一堆数据中寻找较大或较小的 k 个数。
对于我们这道题来说,我们要甜度尽可能大,那就是找甜度较大的 k 个数;但是,在甜度相等的时候,要酸度尽可能小。
我们可以使用 pair<int, int> 类型来存储每一个蜜柑的甜度和酸度。
pair<int, int> 的默认比较大小的方式是:首先比较 first,first 大就大; 相等再看 , 大就大。
但是这里要求的比较方式是:先比较甜度,甜度大就大;甜度相等再看酸度,酸度要尽可能小。
所以我们需要自己实现一个可调用对象来比较两个 类型的对象。


