刷题的日常-字符串转化后的各位数字之和

70 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
    }
}

image.png