376-字符串解码 | 豆包MarsCode AI刷题

88 阅读4分钟

问题描述

小R正在处理一个包含小写字母的字符串解码问题。给定一个长度为N的字符串S,其中包含小写英文字母。字符串的解码规则如下:

  1. 字符 'x' 应解码为 'y',字符 'y' 应解码为 'x'
  2. 字符 'a' 应解码为 'b',字符 'b' 应解码为 'a'
  3. 所有其他字符保持不变。

你的任务是返回解码后的字符串。


测试样例

样例1:

输入:N = 5, S = "xaytq"
输出:'ybxtq'

样例2:

输入:N = 6, S = "abcxyz"
输出:'bacyxz'

样例3:

输入:N = 3, S = "zzz"
输出:'zzz'

解题思路

刚开始拿到这套题的时候,我们应该要

  1. 理解问题

    • 我们需要对字符串 S 进行解码

      • 'x' 变为 'y''y' 变为 'x'

      • 'a' 变为 'b''b' 变为 'a'

      • 其他字符保持不变。

  2. 选择我们的数据结构 可以使用一个字符数组来存储解码后的字符串,这样可以方便地对每个字符进行修改。

  3. 算法步骤

    • 遍历字符串 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 的长度。

先分析下时间复杂度:

  1. 遍历字符串 S

    for (int i = 0; i < N; i++) {

        char c = S.charAt(i);

    • 这个循环会执行 N 次,其中 N 是字符串 S 的长度。
  2. 字符转换:这个地方

    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 的长度。

再解释下空间复杂度:

  1. 字符数组 decoded

    char[] decoded = new char[N];

    创建了一个大小为 N 的字符数组 decoded,用于存储解码后的字符。

  2. 其他变量

    • 除了字符数组 decoded 之外,代码中还使用了几个变量(如 ci 等),但这些变量的空间占用是常数级别的。

这是一道很简单的题目,思路很明了,就难在想不想得起java的api了哈哈