问题描述
小R正在处理一个包含小写字母的字符串解码问题。给定一个长度为N的字符串S,其中包含小写英文字母。字符串的解码规则如下:
- 字符
'x'应解码为'y',字符'y'应解码为'x'。 - 字符
'a'应解码为'b',字符'b'应解码为'a'。 - 所有其他字符保持不变。
你的任务是返回解码后的字符串。
测试样例
样例1:
输入:
N = 5, S = "xaytq"
输出:'ybxtq'
样例2:
输入:
N = 6, S = "abcxyz"
输出:'bacyxz'
样例3:
输入:
N = 3, S = "zzz"
输出:'zzz'
解题思路
刚开始拿到这套题的时候,我们应该要
-
理解问题:
-
我们需要对字符串
S进行解码-
'x'变为'y','y'变为'x'。 -
'a'变为'b','b'变为'a'。 -
其他字符保持不变。
-
-
-
选择我们的数据结构 可以使用一个字符数组来存储解码后的字符串,这样可以方便地对每个字符进行修改。
-
算法步骤:
-
遍历字符串
S中的每个字符:- 使用一个循环来遍历字符串
S中的每个字符。
- 使用一个循环来遍历字符串
-
根据解码规则转换字符:
- 对于每个字符,检查它是否是
'x'、'y'、'a'或'b'。 - 如果是这些字符,根据规则将其转换为对应的字符。
- 如果不是这些字符,保持原样。
- 对于每个字符,检查它是否是
-
将解码后的字符存储到结果字符数组中:
- 将转换后的字符存储到字符数组
decoded中。
- 将转换后的字符存储到字符数组
-
将字符数组转换为字符串并返回:
- 最后,将字符数组
decoded转换为字符串并返回。
- 最后,将字符数组
-
代码
public class Main {
public static String solution(int N, String S) {
// 创建一个字符数组来存储解码后的字符
char[] decoded = new char[N];
// 遍历字符串 S 中的每个字符
for (int i = 0; i < N; i++) {
char c = S.charAt(i);
// 根据解码规则转换字符
if (c == 'x') {
decoded[i] = 'y';
} else if (c == 'y') {
decoded[i] = 'x';
} else if (c == 'a') {
decoded[i] = 'b';
} else if (c == 'b') {
decoded[i] = 'a';
} else {
// 其他字符保持不变
decoded[i] = c;
}
}
// 将字符数组转换为字符串并返回
return new String(decoded);
}
public static void main(String[] args) {
System.out.println(solution(5, "xaytq").equals("ybxtq"));
System.out.println(solution(6, "abcxyz").equals("bacyxz"));
System.out.println(solution(3, "zzz").equals("zzz"));
}
}
关键代码解释: 因为题目已经给得很明确了,只是将一部分的字符替换,所以我们是可以用if else的简单条件判断去替换。
- 我们使用一个
for循环来遍历字符串S中的每个字符。i是循环变量,从0开始,直到N-1。 S.charAt(i)用于获取字符串S中索引为i的字符,并将其存储在变量c中。 然后在条件循环里:- 我们使用
if-else语句来检查当前字符c是否是'x'、'y'、'a'或'b'。 - 如果是这些字符,根据解码规则将其转换为对应的字符,并存储在
decoded数组的相应位置。 - 如果不是这些字符,直接将字符
c存储在decoded数组的相应位置。
个人感悟
整个算法的时间复杂度是 O(N),其中 N 是字符串 S 的长度。空间复杂度是 O(N),其中 N 是字符串 S 的长度。
先分析下时间复杂度:
-
遍历字符串
S:for (int i = 0; i < N; i++) {
char c = S.charAt(i);
- 这个循环会执行
N次,其中N是字符串S的长度。
- 这个循环会执行
-
字符转换:这个地方
if (c == 'x') {
decoded[i] = 'y';
} else if (c == 'y') {
decoded[i] = 'x';
} else if (c == 'a') {
decoded[i] = 'b';
} else if (c == 'b') {
decoded[i] = 'a';
} else {
decoded[i] = c;
}
- 每个字符的转换操作是常数时间复杂度
O(1)。
- 每个字符的转换操作是常数时间复杂度
因此,整个算法的时间复杂度是 O(N),其中 N 是字符串 S 的长度。
再解释下空间复杂度:
-
字符数组
decoded:char[] decoded = new char[N];
创建了一个大小为
N的字符数组decoded,用于存储解码后的字符。 -
其他变量:
- 除了字符数组
decoded之外,代码中还使用了几个变量(如c、i等),但这些变量的空间占用是常数级别的。
- 除了字符数组
这是一道很简单的题目,思路很明了,就难在想不想得起java的api了哈哈