简单题:小D的 abc 变换问题| 豆包MarsCode AI刷题

206 阅读3分钟

题目要求

小D拿到了一个仅由 "abc" 三种字母组成的字符串。她每次操作会对所有字符同时进行以下变换:

  • 将 'a' 变成 'bc'
  • 将 'b' 变成 'ca'
  • 将 'c' 变成 'ab'

小D将重复该操作 k 次。你的任务是输出经过 k 次变换后,得到的最终字符串。

思路分析

本题的核心在于每次操作都会使字符串长度翻倍,操作次数增加,字符串长度会以指数级增长。因此:

  • 若直接构造整个字符串,随着 kkk 值增大,内存占用和运行时间都会迅速增大。
  • 可通过逐次迭代操作的方法,利用 StringBuilder 来拼接字符串,确保每次操作的结果都准确无误。
  • 图解分析

以输入 s = "abc"k = 2 为例:

  • 第 1 次操作
    初始字符串 s = "abc"

    • 'a''bc'
    • 'b''ca'
    • 'c''ab'

    经过第 1 次操作后,字符串变为:"bccab"

  • 第 2 次操作: 新字符串 s = "bccab"

    • 'b''ca'
    • 'c''ab'
    • 'c''ab'
    • 'a''bc'
    • 'b''ca'

    经过第 2 次操作后,最终得到字符串为:"caababbcbcca"

代码实现

public class Main {
    public static String solution(String s, int k) {

    // write code here
   
    for(int i=1;i<=k;i++){
        StringBuilder next = new StringBuilder(); // 用于存储新的字符串
        for(int j=0;j<s.length();j++){
            // 根据字符的不同添加不同的替换字符串
            if (s.charAt(j) == 'a') {
                next.append("bc");
            } else if (s.charAt(j) == 'b') {
                next.append("ca");
            } else if (s.charAt(j) == 'c') {
                next.append("ab");
            }

        }
   // 更新 s 为当前操作完成后的字符串
            s = next.toString();
        }
        return s;
    }

public static void main(String[] args) {
    System.out.println(solution("abc", 2).equals("caababbcbcca"));
    System.out.println(solution("abca", 3).equals("abbcbccabccacaabcaababbcabbcbcca"));
    System.out.println(solution("cba", 1).equals("abcabc"));
}
}

知识总结

  1. StringBuilder 的使用:在处理大量字符串拼接操作时,StringBuilder 的效率远高于直接使用字符串。每次 append 操作不会创建新的字符串对象,从而节省了内存和时间。
  2. 字符串替换策略:对于递归替换的问题,注意每次替换后的字符串结构,记录并观察字符串的模式是否有规律性。
  3. 指数增长规律:当字符串长度在每次操作后按倍数增长时,需要谨慎处理大规模数据,避免内存占用过大。

学习建议

  • 入门建议:建议刚入门同学从简单的字符串操作入手,比如字符替换、拼接等,逐步理解 StringBuilder 的优势。
  • 尝试不同实现:可以尝试用递归、迭代和记忆化等不同方法实现该题目,了解不同实现方式的性能差异。
  • 总结规律:观察题目中出现的规律性,在理解规律的基础上,可以避免直接模拟,提升代码效率。

个人思考

这道题目,和我昨天写的那个题目有相似之处,都用到了charAt()函数,用于遍历单个字符串。由于我是初学者,昨天刚学到这个charAt()函数,今天就直接想到了,算是一种进步吧哈哈!!今天又学到了StringBuilder对象!!

小菜鸟在不断进步~~~一起加油!(2024.11.04)