T29 T34题解 | 豆包MarsCode AI刷题

84 阅读3分钟

小 D 字符串变换问题

一、题目分析

本题要求对仅由 "abc" 三种字母组成的字符串进行特定变换操作,并重复 k 次后得到最终字符串。关键在于理解每次变换的规则,即 'a' 变为 'bc','b' 变为 'ca','c' 变为 'ab',并且要高效地处理重复 k 次的变换过程。需要考虑如何在每次变换时准确地更新字符串内容,以及如何避免不必要的字符串操作开销。

二、题解思路

  • 首先创建两个 StringBuilder 对象 sbsb1sb 初始化为输入字符串 ssb1 用于临时存储每次变换后的结果。
  • 通过外层循环 k 次来控制变换的重复次数。
  • 在内层循环中,遍历当前 sb 中的每个字符。根据字符是 'a'、'b' 还是 'c',将其对应的变换结果追加到 sb1 中。这里没有直接使用 sb.replace 方法,是因为其在字符串较长且多次替换时性能较差,而使用 StringBuilder 追加的方式效率更高。
  • 当内层循环结束,即一次变换完成后,将 sb 清空,并把 sb1 的内容赋值给 sb,然后清空 sb1,为下一次变换做准备。
  • 最后返回经过 k 次变换后的 sb 所表示的字符串。
    public static String solution(String s, int k) {
        // write code here
        StringBuilder sb = new StringBuilder(s);
        StringBuilder sb1 = new StringBuilder();
        for (int i = 0; i < k; i++) {
            int size = sb.length();
            for (int j = 0; j < size; j++) {
                if (sb.charAt(j) == 'a') {
                    // sb.replace(j, j+1, "bc");
                    sb1.append("bc");
                } else if (sb.charAt(j) == 'b') {
                    sb1.append("ca");
                } else if (sb.charAt(j) == 'c') {
                    sb1.append("ab");
                }
            }
            // System.out.print(sb1.toString());
            sb.delete(0, sb.length());
            sb.append(sb1.toString());
            sb1.delete(0, sb1.length());
        }

        return sb.toString();
    }

小 M 目标分数确定问题

一、题目分析

本题给定一个分数数组,要求根据特定规则确定小 M 的目标分数。规则是如果分数中有三个或以上不同的分数,返回其中第三大的分数;如果不同的分数只有两个或更少,则选择最大的分数作为目标。需要对分数数组进行去重处理,并能方便地获取到不同分数的排序信息。

二、题解思路

  • 创建一个 HashSet 对象 set 用于对分数数组进行去重,同时创建一个大顶堆 PriorityQueue 对象 pq,通过自定义比较器 (a,b)->b - a 实现大顶堆功能,用于存储去重后的分数并方便获取最大分数。
  • 遍历分数数组 nums,如果当前分数不在 set 中,则将其加入 pq 并添加到 set 中,这样就实现了去重并将分数加入大顶堆的操作。
  • 然后判断 pq 的大小,如果 pq 中不同分数的数量小于等于 2,则直接返回堆顶元素,即最大分数。
  • 如果 pq 中不同分数数量大于 2,则先从堆顶弹出两个最大分数,此时堆顶元素即为第三大分数,将其弹出并返回作为目标分数。
public static int solution(int n, int[] nums) {
        Set<Integer> set = new HashSet<>();
        PriorityQueue<Integer> pq = new PriorityQueue<>((a,b)->b-a);

        for(int i = 0;i<n;i++){
            if(!set.contains(nums[i])){
                pq.add(nums[i]);
                set.add(nums[i]);
            }
        }

        if(pq.size()<=2)return pq.poll();
        else{
            for(int i = 0;i<2;i++){
                pq.poll();
            }
            return pq.poll();
        }

    }