开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
现在就是大逃杀
刷题的日常-2022年12月15号
一天一题,保持脑子清爽
字符串转化后的各位数字之和
来自leetcode的 1945 题,题意如下:
给你一个由小写字母组成的字符串 s ,以及一个整数 k 。
首先,用字母在字母表中的位置替换该字母,将 s 转化 为一个整数(也就是,'a' 用 1 替换,'b' 用 2 替换,... 'z' 用 26 替换)。接着,将整数 转换 为其 各位数字之和 。共重复 转换 操作 k 次 。
例如,如果 s = "zbax" 且 k = 2 ,那么执行下述步骤后得到的结果是整数 8 :
转化:"zbax" ➝ "(26)(2)(1)(24)" ➝ "262124" ➝ 262124
转换 #1:262124 ➝ 2 + 6 + 2 + 1 + 2 + 4 ➝ 17
转换 #2:17 ➝ 1 + 7 ➝ 8
返回执行上述操作后得到的结果整数。
理解题意
通过题意,我们可以将信息整理如下:
- 题目给出一个字符串 和 一个数值k
- 字符串由小写单词组成,要求我们将单词转换成字母出现的位置
- 将转换的位置相加,形成一个新的数值
- 将操作执行 k 次,返回最终的数值
做题思路
在一开始的时候我们就需要先进行转换,因为题目限制了 k 至少为 1,接下来就可以根据规则循环计算,步骤如下:
- 开辟一个队列记录数值
- 将出现的字符转换为对应的位置
- 首先计算第一次转换的结果
- 如果 k 仍旧大于 0,进行循环计算
- 返回最终结果
代码实现
代码实现如下:
public class Solution {
public int getLucky(String s, int k) {
Queue<Integer> queue = new ArrayDeque<>(s.length() * 2);
for (int i = 0; i < s.length(); i++) {
int c = s.charAt(i) - '`';
if (c > 9) {
queue.add(c / 10);
}
queue.add(c % 10);
}
int res = calc(queue);
while (--k > 0) {
res = calc(queue);
if (res < 10) {
break;
}
}
return res;
}
private int calc(Queue<Integer> queue) {
int size = queue.size(), res = 0;
while (size-- > 0) {
res += queue.poll();
}
String tmp = String.valueOf(res);
for (int i = 0; i < tmp.length(); i++) {
queue.add(tmp.charAt(i) - '0');
}
return res;
}
}