leetcode
leetcode 1601 ~ 1650
将所有数字用字符替换

将所有数字用字符替换

难度:

标签:

题目描述

代码结果

运行时间: 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'?
在该算法中,实际上没有直接的检查来确保`chr(ord(s[i - 1]) + int(s[i]))`的结果不会超过'z'。如果要确保不超过'z',可以在转换前添加一个条件检查。例如,可以使用`min`函数来确保不超过'z'的ASCII码:`chr(min(ord(s[i - 1]) + int(s[i]), ord('z')))。这样即使数字加上前一个字符的ASCII码超过了'z',输出也会被限制在'z'。
🦆
题解提到字符串s的奇数位置上是数字,但没有明确说明如何处理两位数或更大的数字(例如'12'),这种情况在算法中如何处理?
当前题解的算法设计假设字符串s中每个数字字符都只有一位,因此不支持处理两位数或更大的数字。如果遇到两位数或更大的数字,则需要修改算法以支持解析完整的数字字符串。这可以通过检查连续的数字字符并将它们转换成一个完整的数字来实现。然而,基于题解现有的代码结构和逻辑,这种情况并不适用,需要更多的上下文或对问题描述的重新定义。
🦆
在题解的代码中,为什么选择使用`ord(s[i]) < 97`来判断字符是不是数字,而不是直接使用`s[i].isdigit()`?
使用`ord(s[i]) < 97`来判断字符是否为数字是一种基于ASCII值的判断方法。这种方法假设输入的字符要么是小写字母(ASCII码97到122),要么是数字(ASCII码在48到57之间)。尽管这种方法有效,但使用`s[i].isdigit()`会更清晰和直观,因为它直接表明代码的意图是检查字符是否为数字,并且不依赖于特定的ASCII码范围。使用`isdigit()`提高了代码的可读性和可维护性。

相关问题