226.小T的密码变换规则
问题描述
小T设计了一套密码变换规则,将输入的字符串转换成一串数字密码。变换规则如下:
- 小写字母按以下映射关系进行转换:
a, b, c->2d, e, f->3g, h, i->4j, k, l->5m, n, o->6p, q, r, s->7t, u, v->8w, x, y, z->9
- 大写字母先转为小写字母,再跳到字母表中的前一个字母,并按上述规则转换为对应的数字。例如,
B转换为a,再转换为2;A特殊处理,先变为Z,再转换为9。 - 非字母字符保持不变。
例如:对于输入字符串 "LIming0701",转换后的数字密码为 5464640701。
解题思路
1.数据结构选择:
- 使用
StringBuilder来构建最终的输出字符串,因为StringBuilder在字符串拼接操作上比String更高效。 - 使用
switch语句来处理小写字母的映射,因为映射关系是固定的。 - 使用
if-else语句来处理大写字母的特殊转换逻辑。 2.算法步骤:
-
遍历输入字符串:对每个字符进行处理。
-
判断字符类型:
- 如果是小写字母,直接使用预定义的映射关系转换。
- 如果是大写字母,先转为小写字母,再跳到字母表中的前一个字母,然后使用预定义的映射关系转换。
- 如果是非字母字符,直接添加到结果中。
-
构建结果字符串:将处理后的字符依次添加到
StringBuilder中。 -
返回结果:将
StringBuilder转换为字符串并返回。
414.小U生活事件快乐值最大化
问题描述
小U喜欢分享她的日常生活。她有nn个事件可以选择分享,分享第ii个事件需要花费titi的时间和hihi的精力来编辑文章,并能够获得aiai的快乐值。小U想知道,在总花费时间不超过TT且总花费精力不超过HH的前提下,她最多可以获得多少快乐值。
解题思路
1.数据结构选择:
-
使用三维动态规划数组
dp[i][j][k],其中i表示前i个事件,j表示当前总时间,k表示当前总精力。 -
dp[i][j][k]表示在前i个事件中,在总时间不超过j且总精力不超过k的情况下,能够获得的最大快乐值。 2.算法步骤: -
初始化:将
dp数组初始化为 0。 -
状态转移:
-
对于每个事件
i,我们有两种选择:- 不选择第
i个事件:dp[i][j][k] = dp[i-1][j][k]。 - 选择第
i个事件:如果当前时间和精力足够(即j >= t[i-1]且k >= h[i-1]),则dp[i][j][k] = max(dp[i][j][k], dp[i-1][j-t[i-1]][k-h[i-1]] + a[i-1])。
- 不选择第
-
-
最终结果:
dp[n][T][H]即为在总时间T和总精力H的限制下,能够获得的最大快乐值。
总结
在刷算法题的过程中,我总结了几个重要的知识点,并通过具体的例子进行了深入的梳理和分析。例如,二分查找算法用于在有序数组中高效地查找目标值;动态规划则擅长解决具有重叠子问题和最优子结构的问题,如背包问题;贪心算法适用于每一步都采取当前状态下最好选择的问题,如最小生成树。