22 最少字符串操作次数
问题理解
给定一个只包含小写字母的字符串 S,我们可以执行如下操作:每次选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。目标是找到最少需要多少次操作才能使得字符串中的所有字母都不相同。
解题思路
统计字符频率:使用 HashMap 统计每个字符的出现次数。
计算操作次数:对于每个字符,计算 count / 2 来确定需要进行的操作次数。
核心代码
9 超市里的货架调整
问题理解
需要计算在最优调整下,最多可以卖出多少件商品。这里的“最优调整”意味着需要重新排列商品的顺序,使得尽可能多的顾客能够在前几个格子中找到他们想要的商品。
解题思路
- 统计商品频率:使用数组
productFrequency来统计每个商品的出现次数。 - 统计顾客需求:使用数组
demandFrequency来统计每个商品的需求次数。 - 计算优先级并排序:创建了一个
ProductPriority类来存储商品的优先级,并根据需求频率和货架频率进行排序。 - 计算最大销售量:根据排序后的商品顺序,计算最多可以卖出多少件商品。
核心代码
关键知识点
- 字符处理:
-
- 使用
char类型来表示商品和顾客需求的字符。 - 通过
char - 'a'的方式将字符转换为数组的索引,这是一种常见的字符处理技巧。
- 使用
- 自定义类和排序:
-
- 创建了一个
ProductPriority类来存储商品的优先级信息。 - 通过实现
Comparable接口,使得我们可以根据需求频率和货架频率对商品进行排序。 Collections.sort方法用于对List进行排序。
- 创建了一个
11 观光景点组合得分问题
问题理解
找到一对景点 (i, j) 使得 values[i] + values[j] + i - j 最大。
解题思路
- 公式分解:
-
- 公式
values[i] + values[j] + i - j可以分解为(values[i] + i) + (values[j] - j)。 - 这意味着我们可以分别计算
values[i] + i和values[j] - j,然后找到它们的和的最大值。
- 公式
- 优化思路:
-
- 我们可以遍历数组,同时维护一个变量来记录当前最大的
values[i] + i。 - 对于每个
j,我们计算values[j] - j并与当前最大的values[i] + i相加,更新最大得分。
- 我们可以遍历数组,同时维护一个变量来记录当前最大的