小李的伴学笔记5 | 豆包MarsCode AI刷题

49 阅读3分钟

477.相邻重复字母删除问题

问题描述

小M拿到了一个由小写字母组成的字符串 s。她发现可以进行一种操作:选择两个相邻且相同的字母并删除它们。她可以在 s 上反复进行此操作,直到无法再删除任何字母。

请返回最终处理完所有重复项删除操作后的字符串。可以保证返回的答案是唯一的。

解题思路

数据结构选择

我们可以使用栈(Stack)来解决这个问题。栈的特点是后进先出(LIFO),非常适合处理相邻元素的删除操作。

算法步骤

  1. 初始化一个栈:用于存储字符。

  2. 遍历字符串中的每个字符:

    • 如果栈不为空且栈顶元素与当前字符相同,则弹出栈顶元素(即删除相邻的相同字符)。
    • 否则,将当前字符压入栈中。
  3. 构建最终结果字符串:将栈中的字符按顺序取出,形成最终的字符串。

代码

import java.util.*;
public class Main {
    public static String solution(String s) {
        // write code here
        Stack<Character> stack = new Stack<>();
        
        for (char c : s.toCharArray()) {
            if (!stack.isEmpty() && stack.peek() == c) {
                stack.pop(); // 删除栈顶元素
            } else {
                stack.push(c); // 将当前字符压入栈中
            }
        }
        
        // 构建最终结果字符串
        StringBuilder result = new StringBuilder();
        for (char c : stack) {
            result.append(c);
        }
        
        return result.toString();
    }

    public static void main(String[] args) {
        System.out.println(solution("abbaca").equals("ca"));
        System.out.println(solution("azxxzy").equals("ay"));
        System.out.println(solution("a").equals("a"));
    }
}

446.最大化数组和的问题

### 问题描述

小F得到了一个长度为 N 的数组 A,其中每个元素都是偶数,且数组编号从 0 到 N-1。请注意,数组 A 中的整数可以是负数。

你需要执行 N 个任务,编号从 0 到 N-1。在任务 i 中,你可以选择将 A[i] 乘以 2 或将 A[i] 除以 2

你的任务是通过执行这些操作后,使数组 A 的元素和达到最大值,并返回这个最大和。

解题思路

  1. 初始化总和:首先,计算数组 A 的初始总和。

  2. 遍历数组:对于每个元素 A[i]

    • 如果 A[i] 是正数,考虑将其乘以 2 是否能增加总和。
    • 如果 A[i] 是负数,考虑将其除以 2 是否能增加总和。
  3. 选择最优操作:对于每个元素,选择能使总和增加最多的操作。

  4. 返回最大总和:在遍历完所有元素后,返回最终的总和。

数据结构与算法

  • 数据结构:使用数组 A 来存储输入数据。
  • 算法:遍历数组,对每个元素进行操作,选择最优操作,更新总和。

感想

栈这种数据结构的 “后进先出” 特性在解题过程中得到了充分体现。每一道题都像是一个待解的谜题,利用栈的特性去巧妙地处理数据顺序是解题的关键。例如在括号匹配问题中,栈就像是一个严格的检查员,通过不断地压入和弹出操作来判断括号是否匹配。 其次,栈在处理递归问题转化为迭代问题时发挥了重要作用。它能够模拟函数调用栈,帮助我们更高效地解决问题。在解决一些复杂的路径搜索或者表达式求值问题时,栈提供了一种简洁而有效的思路。 然而,在解题过程中也遇到了不少挑战。有时会因为没有正确地把握数据进出栈的时机,导致结果错误。这让我明白,对栈的操作必须精准且有条理。