首页 > 编程语言 >【数据结构与算法 | 灵神题单 | 栈基础篇】力扣1441, 844, 682

【数据结构与算法 | 灵神题单 | 栈基础篇】力扣1441, 844, 682

时间:2024-09-21 21:19:32浏览次数:3  
标签:844 target 记录 int 示例 数组 力扣 1441 stack

1. 力扣1441:用栈操作构建数组

1.1 题目:

给你一个数组 target 和一个整数 n。每次迭代,需要从  list = { 1 , 2 , 3 ..., n } 中依次读取一个数字。

请使用下述操作来构建目标数组 target :

  • "Push":从 list 中读取一个新元素, 并将其推入数组中。
  • "Pop":删除数组中的最后一个元素。
  • 如果目标数组构建完成,就停止读取更多元素。

题目数据保证目标数组严格递增,并且只包含 1 到 n 之间的数字。

请返回构建目标数组所用的操作序列。如果存在多个可行方案,返回任一即可。

示例 1:

输入:target = [1,3], n = 3
输出:["Push","Push","Pop","Push"]
解释: 
读取 1 并自动推入数组 -> [1]
读取 2 并自动推入数组,然后删除它 -> [1]
读取 3 并自动推入数组 -> [1,3]

示例 2:

输入:target = [1,2,3], n = 3
输出:["Push","Push","Push"]

示例 3:

输入:target = [1,2], n = 4
输出:["Push","Push"]
解释:只需要读取前 2 个数字就可以停止。

提示:

  • 1 <= target.length <= 100
  • 1 <= n <= 100
  • 1 <= target[i] <= n
  • target 严格递增

1.2 思路:

哈希表记录target数组的值,分遇见了和没遇见两种情况讨论。

1.3 题解:

class Solution {
    public List<String> buildArray(int[] target, int n) {
        List<String> list = new LinkedList<>();
        // 用哈希表将数组中的值存起来
        // 如果遇到了,就加入push,否则加入push和pop
        HashSet<Integer> hashset = new HashSet<>();
        for(int i : target){
            hashset.add(i);
        }
        //target[target.length-1]肯定是小于等于n的
        // 所以条件范围用target[target.length-1]限定
        for(int i = 1; i <= target[target.length-1]; i++){
            if(!hashset.contains(i)){
                list.add("Push");
                list.add("Pop");
            }else{
                list.add("Push");
            }
        }
        return list;
    }
}

2. 力扣844:比较含退格的字符串

2.1 题目:

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。

示例 1:

输入:s = "ab#c", t = "ad#c"
输出:true
解释:s 和 t 都会变成 "ac"。

示例 2:

输入:s = "ab##", t = "c#d#"
输出:true
解释:s 和 t 都会变成 ""。

示例 3:

输入:s = "a#c", t = "b"
输出:false
解释:s 会变成 "c",但 t 仍然是 "b"。

提示:

  • 1 <= s.length, t.length <= 200
  • s 和 t 只含有小写字母以及字符 '#'

进阶:

  • 你可以用 O(n) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?

2.2 思路:

用栈也可以,我用的是StringBuffer的api,主要是equals可以省去了最后的比较过程比较方便和操作都可以调用api来完成。

2.3 题解:

class Solution {
    public boolean backspaceCompare(String s, String t) {
        
        StringBuffer sb1 = new StringBuffer();
        StringBuffer sb2 = new StringBuffer();
        for(int i = 0; i < s.length(); i++){
            char ch1 = s.charAt(i);
            if(ch1 != '#'){
                sb1.append(ch1);
            }else{
                // 这里防止当sb为空的时候遇见#,deleteCharAt会报错
                if(sb1.length()-1 >= 0){
                    sb1.deleteCharAt(sb1.length()-1);
                }
            }
            
        }
        for(int i = 0; i < t.length(); i++){
            char ch2 = t.charAt(i);
            if(ch2 != '#'){
                sb2.append(ch2);
            }else{
                if(sb2.length()-1 >= 0){
                    sb2.deleteCharAt(sb2.length()-1);
                }
                
            }
        }
        return sb1.toString().equals(sb2.toString());

    }
}

3. 力扣682:棒球比赛

3.1 题目:

你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。

比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:

  1. 整数 x - 表示本回合新获得分数 x
  2. "+" - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。
  3. "D" - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效的分数。
  4. "C" - 表示前一次得分无效,将其从记录中移除。题目数据保证记录此操作时前面总是存在一个有效的分数。

请你返回记录中所有得分的总和。

示例 1:

输入:ops = ["5","2","C","D","+"]
输出:30
解释:
"5" - 记录加 5 ,记录现在是 [5]
"2" - 记录加 2 ,记录现在是 [5, 2]
"C" - 使前一次得分的记录无效并将其移除,记录现在是 [5].
"D" - 记录加 2 * 5 = 10 ,记录现在是 [5, 10].
"+" - 记录加 5 + 10 = 15 ,记录现在是 [5, 10, 15].
所有得分的总和 5 + 10 + 15 = 30

示例 2:

输入:ops = ["5","-2","4","C","D","9","+","+"]
输出:27
解释:
"5" - 记录加 5 ,记录现在是 [5]
"-2" - 记录加 -2 ,记录现在是 [5, -2]
"4" - 记录加 4 ,记录现在是 [5, -2, 4]
"C" - 使前一次得分的记录无效并将其移除,记录现在是 [5, -2]
"D" - 记录加 2 * -2 = -4 ,记录现在是 [5, -2, -4]
"9" - 记录加 9 ,记录现在是 [5, -2, -4, 9]
"+" - 记录加 -4 + 9 = 5 ,记录现在是 [5, -2, -4, 9, 5]
"+" - 记录加 9 + 5 = 14 ,记录现在是 [5, -2, -4, 9, 5, 14]
所有得分的总和 5 + -2 + -4 + 9 + 5 + 14 = 27

示例 3:

输入:ops = ["1"]
输出:1

提示:

  • 1 <= ops.length <= 1000
  • ops[i] 为 "C""D""+",或者一个表示整数的字符串。整数范围是 [-3 * 104, 3 * 104]
  • 对于 "+" 操作,题目数据保证记录此操作时前面总是存在两个有效的分数
  • 对于 "C" 和 "D" 操作,题目数据保证记录此操作时前面总是存在一个有效的分数

3.2 思路:

典型的栈的问题,用栈记录合适的数字,然后依据题目判断即可。

3.3 题解:

class Solution {
    public int calPoints(String[] operations) {
        Deque<Integer> stack = new LinkedList<>();

        for(String s : operations){
            if (s.equals("C")){
                stack.pop();
            }else if (s.equals("D")){
                stack.push(stack.peek()*2);
            }else if (s.equals("+")){
                int i = stack.pop();
                int sum = i + stack.peek();
                stack.push(i);
                stack.push(sum);
            }else{
                // 如果是数字就加入
                stack.push(Integer.parseInt(s));
            }
        }
        int sums = 0;
        for(int i : stack){
            sums += i;
        }
        return sums;
    }
}

标签:844,target,记录,int,示例,数组,力扣,1441,stack
From: https://blog.csdn.net/2301_80912559/article/details/142414624

相关文章

  • 力扣最热一百题——除自身以外数组的乘积
    目录题目链接:238.除自身以外数组的乘积-力扣(LeetCode)题目描述示例提示:解法一:左右数组(小型动态规划)实现思路Java写法:运行时间C++写法:运行时间时间复杂度以及空间复杂度总结题目链接:238.除自身以外数组的乘积-力扣(LeetCode)注:下述题目描述和示例均来自力扣......
  • 力扣最热一百题——搜索二维矩阵
    目录题目链接:240.搜索二维矩阵II-力扣(LeetCode)题目描述解法一:暴力不解释Java写法:运行时间C++写法:运行时间时间复杂度以及空间复杂度 解法二:利用自带的大小关系进行Z型走位Java写法:运行时间C++写法运行时间时间复杂度以及空间复杂度总结题目链接:240.......
  • 【力扣20】有效的括号
    20.有效的括号-力扣(LeetCode)括号序列压入栈中,遇到匹配的出栈,最后判断栈是否为空直接使用栈的数据结构stack。classSolution{public:boolisValid(strings){stack<char>stk;//初始化栈for(autoc:s){//入栈if(c=='......
  • 力扣题解2376
    大家好,欢迎来到无限大的频道。今日继续给大家带来力扣题解。题目描述(困难):统计特殊整数如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。给你一个 正 整数 n ,请你返回区间 [1,n] 之间特殊整数的数目。​解题思路:要计算区间([1,n])之间的......
  • 力扣188-买卖股票的最佳时机 IV(Java详细题解)
    题目链接:188.买卖股票的最佳时机IV-力扣(LeetCode)前情提要:本题是由123.买卖股票的最佳时机III-力扣(LeetCode)变形而来,123是只能买卖俩次股票,该题是只能买卖k次股票,我相信当你做完这道题或者看完我上道题的题解,那么写这道题会轻松一点。因为本人最近都来刷dp类的题......
  • 1,Python数分之Pandas训练,力扣,1783. 大满贯数量
    学习:知识的初次邂逅复习:知识的温故知新练习:知识的实践应用目录 一,原题力扣链接二,题干三,建表语句四,分析四,Pandas解答:五,验证六,总结 一,原题力扣链接.-力扣(LeetCode)二,题干表:Players+----------------+---------+|ColumnName|Type|+--------......
  • 【力扣刷题】2090.半径为k的子数组平均值(定长滑动窗口)
    题目:给你一个下标从 0 开始的数组 nums ,数组中有 n 个整数,另给你一个整数 k 。半径为k的子数组平均值 是指:nums 中一个以下标 i 为 中心 且 半径 为 k 的子数组中所有元素的平均值,即下标在 i-k 和 i+k 范围(含 i-k 和 i+k)内所有元素的平均......
  • 【力扣刷题】1232.缀点成线
    题目:给定一个数组 coordinates ,其中 coordinates[i]=[x,y] , [x,y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。示例1:输入:coordinates=[[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]]输出:true示例2: 输入:coordina......
  • 代码随想录算法训练营第十六天 | Javascript | 力扣Leetcode | 回溯 | 77. 组合、216.
    目录前言简介题目链接:77.组合题目链接:216.组合总和3题目链接:17.电话号码的字母组合前言踏平坎坷成大道,斗罢艰险又出发!自律的尽头是自控,自控的尽头是硬控。愿道友们披荆斩棘,终能得偿所愿。简介本人是小几年经验的前端开发,算法基础只有力扣几十道题,非常薄......
  • 代码随想录算法训练营第十五天 | Javascript | 继续二叉树的一天 | 力扣Leetcode | 补
    目录前言简介题目链接:501.二叉搜索树中的众数题目链接:236.二叉树的最近公共祖先题目链接:235.二叉搜索树的最近公共祖先前言踏平坎坷成大道,斗罢艰险又出发!自律的尽头是自控,自控的尽头是硬控。愿道友们披荆斩棘,终能得偿所愿。简介本人是小几年经验的前端开发,......