Sum of Digits of String After Convert
Problem
You are given a string s consisting of lowercase English letters, and an integer k.
First, convert s into an integer by replacing each letter with its position in the alphabet (i.e., replace 'a' with 1, 'b' with 2, ..., 'z' with 26). Then, transform the integer by replacing it with the sum of its digits. Repeat the transform operation k times in total.
For example, if s = "zbax" and k = 2, then the resulting integer would be 8 by the following operations:
- Convert:
"zbax" ➝ "(26)(2)(1)(24)" ➝ "262124" ➝ 262124 - Transform #1:
262124 ➝ 2 + 6 + 2 + 1 + 2 + 4 ➝ 17 - Transform #2:
17 ➝ 1 + 7 ➝ 8
Return the resulting integer after performing the operations described above.
Examples
Example 1:
Input: s = "iiii", k = 1
Output: 36
Explanation: The operations are as follows:
- Convert: "iiii" ➝ "(9)(9)(9)(9)" ➝ "9999" ➝ 9999
- Transform #1: 9999 ➝ 9 + 9 + 9 + 9 ➝ 36
Thus the resulting integer is 36.
Example 2:
Input: s = "leetcode", k = 2
Output: 6
Explanation: The operations are as follows:
- Convert: "leetcode" ➝ "(12)(5)(5)(20)(3)(15)(4)(5)" ➝ "12552031545" ➝ 12552031545
- Transform #1: 12552031545 ➝ 1 + 2 + 5 + 5 + 2 + 0 + 3 + 1 + 5 + 4 + 5 ➝ 33
- Transform #2: 33 ➝ 3 + 3 ➝ 6
Thus the resulting integer is 6.
Example 3:
Input: s = "zbax", k = 2
Output: 8
Solution
Method 1 - Iteration
Here are the steps:
- Convert each character in the string
sto its corresponding position in the alphabet. - Concatenate these positions to form a new string.
- Sum the digits of this string
ktimes or until a single digit is obtained.
Video explanation
Here is the video explaining this method in detail. Please check it out:
<div class="youtube-embed"><iframe src="https://www.youtube.com/embed/lUayPcz1W2w" frameborder="0" allowfullscreen></iframe></div>
Code
Java
public class Solution {
// Main method to perform the conversion
public int getLucky(String s, int k) {
// Step 1: Convert each character to its alphabet position
StringBuilder numSb = new StringBuilder();
for (char ch : s.toCharArray()) {
int num = ch - 'a' + 1;
numSb.append(num);
}
// Step 2: Sum digits `k` times
String currStr = numSb.toString();
for (int i = 0; i < k; i++) {
currStr = sumOfDigits(currStr);
if (currStr.length() == 1) {
break;
}
}
return Integer.parseInt(currStr);
}
// Helper method to sum the digits of a number represented as a string
private String sumOfDigits(String numStr) {
int sum = 0;
for (char digit : numStr.toCharArray()) {
sum += Character.getNumericValue(digit);
}
return Integer.toString(sum);
}
}
Python
class Solution:
def getLucky(self, s: str, k: int) -> int:
def get_alphabet_position(char):
return ord(char) - ord("a") + 1
# Step 1: Convert each character to its alphabet position
numeric_string = "".join(str(get_alphabet_position(char)) for char in s)
# Function to sum the digits of a number represented as a string
def sum_of_digits(num_str):
return str(sum(int(digit) for digit in num_str))
# Step 2: Sum digits `k` times
for _ in range(k):
numeric_string = sum_of_digits(numeric_string)
if len(numeric_string) == 1:
break
return int(numeric_string)
Complexity
- ⏰ Time complexity:
O(k*n), wherekis the number of iterations to sum digits, andnis the length of the input strings.StringBuilder numericStringcan have a length up to2n(assuming each alphabet position is a 2-digit number like '10' to '26'). Hence, space required is O(n).- During
kiterations of summing the digits, the largest space consumption happens initially when the numeric string is largest (2n). After each summing step, the length of the string reduces.
- 🧺 Space complexity:
O(n)