【题目描述】

给你一个由小写字母组成的字符串 ​​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​

返回执行上述操作后得到的结果整数。


【示例】

【LeeCode】1945. 字符串转化后的各位数字之和_字符串

【代码】admin

import java.util.*;
// 2022-12-15

class Solution{
public int getLucky(String str, int k) {
StringBuilder sb = new StringBuilder();
char[] chars = str.toCharArray();
for (char c : chars) {
sb.append(Integer.valueOf(c - 97 + 1)); //记录每一个字符
}

int sum; // 求和
String tmp = sb.toString(); // tmp临时字符
while (k > 1){ // k > 1的时候迭代计算,每次sum从0开始
sum = 0;
for (char c : tmp.toCharArray()) { // 单独计算每个字符的求和
sum += Integer.parseInt(c+"");
}
tmp = String.valueOf(sum);
k--;
}
sum = 0;
for (char c : tmp.toCharArray()) {
sum += Integer.parseInt(c+"");
}
//System.out.println(sum);
return sum;
}
}

public class Main{
public static void main(String[] args) {
String str = "iiii";
int k = 1;
new Solution().getLucky(str, k); // 输出: 36

String str1 = "leetcode";
int k1 = 2;
new Solution().getLucky(str1, k1); // 输出: 6

String str2 = "dbvmfhnttvr";
int k2 = 5;
new Solution().getLucky(str2, k2); // 输出: 5

}
}


【代码】优解

​学习参考​

import java.util.*;
// 2022-12-15

class Solution{
public int getLucky(String str, int k) {
int ans = 0;
for (char c : str.toCharArray()) ans += get(c - 'a' + 1);
for (int i = 1; i < k; i++) ans = get(ans);
return ans;
}

public int get(int t){
int ans = 0;
while (t > 0){
ans += t % 10;
t /= 10;
}
return ans;
}
}

public class Main{
public static void main(String[] args) {
String str = "iiii";
int k = 1;
new Solution().getLucky(str, k); // 输出: 36

String str1 = "leetcode";
int k1 = 2;
new Solution().getLucky(str1, k1); // 输出: 6

String str2 = "dbvmfhnttvr";
int k2 = 5;
new Solution().getLucky(str2, k2); // 输出: 5

}
}