将所有数字用字符替换
难度:
标签:
题目描述
代码结果
运行时间: 24 ms, 内存: 0.0 MB
/*
题目思路:
1. 使用Stream的方式来处理字符串中的字符。
2. 使用IntStream.range遍历所有的下标。
3. 对于奇数下标,用前一个偶数下标的字母和数字计算新的字符。
4. 将计算出的字符替换原来的数字。
*/
import java.util.stream.IntStream;
public class Solution {
public String replaceDigits(String s) {
char[] result = s.toCharArray();
IntStream.range(1, s.length())
.filter(i -> i % 2 == 1)
.forEach(i -> result[i] = shift(result[i - 1], result[i] - '0'));
return new String(result);
}
private char shift(char c, int x) {
return (char) (c + x);
}
}
解释
方法:
此题解通过遍历字符串s的每个字符,根据字符的ASCII码来判断当前字符是字母还是数字。如果是字母(ASCII码大于等于97),则直接添加到结果字符串中;如果是数字(ASCII码小于97),则将其转换为整数,并与前一个字符(必定是字母)的ASCII码相加,使用chr函数将结果转换回字符后添加到结果字符串中。这种方法直接在遍历过程中构建了最终的字符串,避免了额外的替换操作。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在算法中,如何确保在执行`chr(ord(s[i - 1]) + int(s[i]))`时不会超出字母表的范围,即结果不会超过'z'?
▷🦆
题解提到字符串s的奇数位置上是数字,但没有明确说明如何处理两位数或更大的数字(例如'12'),这种情况在算法中如何处理?
▷🦆
在题解的代码中,为什么选择使用`ord(s[i]) < 97`来判断字符是不是数字,而不是直接使用`s[i].isdigit()`?
▷