跳至主要內容

1844. 将所有数字用字符替换


1844. 将所有数字用字符替换

🟢   🔖  字符串  🔗 力扣open in new window LeetCodeopen in new window

题目

You are given a 0-indexed string s that has lowercase English letters in its even indices and digits in its odd indices.

You must perform an operation shift(c, x), where c is a character and x is a digit, that returns the xth character after c.

  • For example, shift('a', 5) = 'f' and shift('x', 0) = 'x'.

For every odd index i, you want to replace the digit s[i] with the result of the shift(s[i-1], s[i]) operation.

Return s ** after replacing all digits. It is guaranteed that shift(s[i-1], s[i]) will never exceed **'z'.

Note that shift(c, x) is not a preloaded function, but an operation to be implemented as part of the solution.

Example 1:

Input: s = "a1c1e1"

Output: "abcdef"

Explanation: The digits are replaced as follows:

  • s[1] -> shift('a',1) = 'b'
  • s[3] -> shift('c',1) = 'd'
  • s[5] -> shift('e',1) = 'f'

Example 2:

Input: s = "a1b2c3d4e"

Output: "abbdcfdhe"

Explanation: The digits are replaced as follows:

  • s[1] -> shift('a',1) = 'b'
  • s[3] -> shift('b',2) = 'd'
  • s[5] -> shift('c',3) = 'f'
  • s[7] -> shift('d',4) = 'h'

Constraints:

  • 1 <= s.length <= 100
  • s consists only of lowercase English letters and digits.
  • shift(s[i-1], s[i]) <= 'z' for all odd indices i.

题目大意

给你一个下标从 0 开始的字符串 s ,它的 偶数 下标处为小写英文字母,奇数 下标处为数字。

定义一个函数 shift(c, x) ,其中 c 是一个字符且 x 是一个数字,函数返回字母表中 c 后面第 x 个字符。

  • 比方说,shift('a', 5) = 'f'shift('x', 0) = 'x'

对于每个 奇数 下标 i ,你需要将数字 s[i]shift(s[i-1], s[i]) 替换。

请你替换所有数字以后,将字符串 s 返回。题目 保证 shift(s[i-1], s[i]) 不会超过 'z'

示例 1:

输入: s = "a1c1e1"

输出: "abcdef"

解释: 数字被替换结果如下:

  • s[1] -> shift('a',1) = 'b'
  • s[3] -> shift('c',1) = 'd'
  • s[5] -> shift('e',1) = 'f'

示例 2:

输入: s = "a1b2c3d4e"

输出: "abbdcfdhe"

解释: 数字被替换结果如下:

  • s[1] -> shift('a',1) = 'b'
  • s[3] -> shift('b',2) = 'd'
  • s[5] -> shift('c',3) = 'f'
  • s[7] -> shift('d',4) = 'h'

提示:

  • 1 <= s.length <= 100
  • s 只包含小写英文字母和数字。
  • 对所有 奇数 下标处的 i ,满足 shift(s[i-1], s[i]) <= 'z'

解题思路

  1. 遍历字符串:我们从索引为 1 的位置开始,每隔一个字符进行操作(即索引为奇数的字符)。对于每个这样的字符:

    • 获取前一个字符的 ASCII 码。
    • 将当前字符(数字字符)转换为数字,并加到前一个字符的 ASCII 码上。
    • 将该字符替换为得到的新字符。
  2. 字符的转换

    • 使用 charCodeAt() 方法获取前一个字符的 ASCII 码。
    • 使用 String.fromCharCode() 方法将计算得到的 ASCII 值转换回字符。
  3. 返回结果:最终将修改后的字符数组重新拼接成字符串返回。

复杂度分析

  • 时间复杂度O(n),其中 n 是字符串 s 的长度,只需遍历一次字符串。
  • 空间复杂度O(n),需要将字符串拆分为字符数组来操作。

代码

/**
 * @param {string} s
 * @return {string}
 */
var replaceDigits = function (s) {
	let chars = s.split('');
	// 从索引为1的字符开始,每隔一个字符处理
	for (let i = 1; i < s.length; i += 2) {
		// 获取前一个字符的 ASCII 码
		const prev = chars[i - 1].charCodeAt();
		// 计算新的字符并替换
		chars[i] = String.fromCharCode(prev + Number(chars[i]));
	}
	// 将字符数组重新拼接为字符串并返回
	return chars.join('');
};

相关题目

题号标题题解标签难度力扣
848字母移位数组 字符串 前缀和🟠🀄️open in new window 🔗open in new window