【Java算法题】剑指offer_数据结构之03队列栈

news2024/11/26 12:26:05

前言

刷题链接:
https://www.nowcoder.com/exam/oj/ta?page=2&tpId=13&type=265

原定于5.30写完队列&栈,超时了14天(2周),于6.13完成。
刷算法题到现在得出一个心得,万事开头难。没刷之前总觉得这很难那很难,开始刷之后反倒觉得轻松了许多。算法都是有共性的,集中刷一段时间,参考一些好的题解就能有收获。

另外,这两周因为工程任务不断,干净的用于学习的时间很少。因为没有时间完成任务,睡眠质量和心态变差,效率低下,简直是一个恶性循环!

3. 队列 & 栈

JZ9 用两个栈实现队列

在这里插入图片描述
思路:

  • step 1:正常push到第一个栈末尾。
  • step 2:将第一个栈的元素弹出,并依次进入第二个栈中。
  • step 3:第一个栈中最后取出的元素是队列首部元素(此时在第二个栈的首位),直接弹出。
  • step 4:再将第二个栈中保存的内容,依次弹出,依次进入第一个栈中,保证了顺序不变。
import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        stack1.push(node);
    }
    
    public int pop() {
        while(!stack1.isEmpty()){ // stack1的存入stack2中
            int in = stack1.pop();
            stack2.push(in);
        }
         
        int out = stack2.pop(); //取出队首元素

        while(!stack2.isEmpty()){//其他元素以原顺序存回stack1
            stack1.push(stack2.pop());
        }
        return out;
    }
}

JZ30 包含min函数的栈

在这里插入图片描述
思路:辅助栈存储min,每push一个node到主栈,辅助栈都会存入当前的最小值。

import java.util.Stack;

public class Solution {
    Stack<Integer> s1 = new Stack<Integer>();
    Stack<Integer> s2 = new Stack<Integer>(); //存储min
    
    public void push(int node) {
        s1.push(node);
        if(s2.isEmpty()||s2.peek()>node){
            s2.push(node);
        }else{
            s2.push(s2.peek()); //s2重复加入min
        }
    }
    
    public void pop() {
       s1.pop();
       s2.pop();
    }
    
    public int top() {
        return s1.peek();
    }
    
    public int min() {
        return s2.peek();
    }
}

JZ31 栈的压入、弹出序列

在这里插入图片描述
思路:辅助栈来检查栈输出数组是否符合弹出栈的规律。

  • 当栈为空或者当前栈输入数组元素不等于当前栈输出数组元素的时候,将栈输入元素输入到辅助栈,栈输入数组索引后移。
  • 当辅助栈栈顶元素和当前栈输出数组元素相同时,弹出该元素,否则访问完所有入栈数组还没有弹出所有元素就为false。
  • 两个序列都访问完毕为true
import java.util.Stack;
public class Solution {
    public boolean IsPopOrder(int [] pushA, int [] popA) {
        Stack<Integer> s = new Stack<Integer>();

        int n = pushA.length;
        int j = 0;
        for(int i = 0;i<n;i++){
            while(j<n && (s.isEmpty()||s.peek()!=popA[i])){
                s.push(pushA[j]);
                j++;
            }
            if(s.peek() == popA[i]){
                s.pop();
            }else{
                return false;
            }
        }
        return true;
    }
}

JZ73 翻转单词序列

在这里插入图片描述
思路:首先想到将字符串按照空格拆分开,存到一个String数组里面,得到数组长度即单词个数。然后使用StringBuffe逆向存储字符串数组,同时添加空格,使用lastIndexOf方法得到最后一个空格的索引值,使用delete删除该空格,用toString转换成String类型返回。

没有用到栈的数据结构

import java.util.*;

public class Solution {
    public String ReverseSentence(String str) {
        //按空格拆分单词
        String[] strs = str.split(" ");
        int n =strs.length;

        StringBuffer s = new StringBuffer();
        for(int i=n-1;i>=0;i--){
            s.append(strs[i]);
            s.append(" ");
        }
        int last_space = s.lastIndexOf(" ");
        s.delete(last_space,last_space+1); //删除最后一个
        String res = s.toString();
        return res;
    }
}
import java.util.*;

public class Solution {
    public String ReverseSentence(String str) {
        //按空格拆分单词
        String[] strs = str.split(" ");
        int n =strs.length;

        Stack<String> temp = new Stack<String>();
        for(int i=0;i<n;i++){
            temp.push(strs[i]);
            temp.push(" ");
        }

        StringBuffer s = new StringBuffer();
        if(!temp.isEmpty()){
            temp.pop(); //去掉最后一个空格
        }
        while(!temp.isEmpty()){
            s.append(temp.pop());
        }

        String res = s.toString();
        return res;
    }
}

算法 01搜索算法

请期待下篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

django的项目结构介绍

目录 django的安装django项目创建django项目启动django项目关闭django项目个个文件分析核心文件 manage.py项目内部文件start01/start01setting文件的讲解 django的安装 pip install django检测安装后的版本 python -m django --versiondjango项目创建 django安装以后 会自动…

面向对象的多态

7. 面向对象特征三&#xff1a;多态性 概念 多态是面向对象程序设计&#xff08;OOP&#xff09;的一个重要特征&#xff0c;指同一个实体同时具有多种形式&#xff0c;即同一个对象&#xff0c;在不同时刻&#xff0c;代表的对象不一样&#xff0c;指的是对象的多种形态。 变…

作为软件工程师对Docker的认知和看法

文章目录 前言一、Docker是什么&#xff1f;二、Docker和Virtual Machine的区别三、Docker架构1. Client2. Docker Host3. Registry 四、Docker在实际应用中的好处配置环境网络和卷更新管理 总结 前言 两年前我还没有接触过Docker&#xff0c;也不理解Docker在自动化工程应用中…

k8s如何使用ceph rbd块存储(静态供给、存储类动态供给)

目录 前言安装ceph集群ceph集群创建rbd块存储rbd块存储不支持ReadWriteManyk8s配置rbd块存储&#xff08;静态供给&#xff09;创建secret创建pv创建pvck8s节点安装客户端依赖包部署pod查看pod验证是否持久化 k8s配置rbd块存储&#xff08;动态供给&#xff09;查看官网ceph集群…

mysql 最常用的一些语句

1 数据库相关操作 CREATE DATABASE IF NOT EXISTS daily-test DEFAULT CHARSET utf8 COLLATE utf8_general_ci&#xff1b; drop database daily_test; use daily_test 具体操作如下图上所示&#xff1a; 2 mysql常用数据类型 MySQL 数据类型 | 菜鸟教程 3 数据库表相关操作…

Stimulsoft Forms.WEB 23.2.6 Crack

Stimulsoft Forms.WEB 发布 创建、编辑、填写、发布和分发交互式表单。 2023 年 6 月 13 日 - 9:34 新产品 特征 您可以为几乎任何目的创建任何类型的文档 - 发票和支票、各种调查问卷和工作表、订单、简历等等。用户收到可编辑的 PDF 格式的完成模板&#xff0c;可以在任何现代…

英伟达开发板学习系列---国产【Jetson Xavier NX】系统安装及基础配置

1. 前言 最近新买了Jetson Xavier NX, 和之前英伟达原厂的NX的区别在于国产Jetson Xavier NX 是核心板使用的是英伟达的&#xff0c;扩展板是国产的。具体详情如下&#xff1a; 官方NX和国产NX详情区别 2. 设置系统从固态硬盘启动 官方NX出厂是直接将SD卡&#xff08;64/12…

Redis GEO地理位置信息的应用

Redis GEO地理位置信息的应用 Redis GEO概述应用场景Redis GEO命令GEO命令演示 Redis GEO实现附近人的功能基础类API接口接口实现执行测试 Redis GEO 概述 Redis的GEO操作是一种基于地理位置信息进行操作的功能。它使用经度和纬度坐标来表示地理位置&#xff0c;支持存储地理位…

湖南大学CS-2020期末考试解析

【特别注意】 答案来源于@wolf 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 有必要一做。 【试卷与答案】 1.简答题(10 分) 假设一个基于 IEEE 浮点格式的 10 位浮点表示,有 1 个符号位,4 个阶码位(k=4)和 5 个 尾数位(n=5)。 (…

湖南大学CS-2018期末考试解析

【特别注意】 答案来源于@wolf 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 有必要一做。 【试卷与答案】 一、选择题(每题 2 分,共 10 分) 1. 0x12345678 存放在采用小端存储的机器上,地址为 0x100 到

湖南大学CS-2017(另一张)期末考试解析

【特别注意】 答案来源于wolf 是我在备考时自己做的&#xff0c;仅供参考&#xff0c;若有不同的地方欢迎讨论。 【试卷评析】 有必要一做。 【试卷与答案】 由于这张试卷没有电子版&#xff0c;我就直接拍我自己的作答了

八大排序算法之归并排序(递归实现+非递归实现)

目录 一.归并排序的基本思想 归并排序算法思想(排升序为例) 二.两个有序子序列(同一个数组中)的归并(排升序) 两个有序序列归并操作代码: 三.归并排序的递归实现 递归归并排序的实现:(后序遍历递归) 递归函数抽象分析: 四.非递归归并排序的实现 1.非递归归并排序算法…

C:\Users\BC>conda -V ‘conda‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

C:\Users\BC>conda -V ‘conda’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 注意&#xff01;&#xff1a;Anaconda安装路径和Scripts路径&#xff0c;两个都添加进去Path 解释&#xff1a;将 Anaconda 安装路径和 Scripts 路径都添加到系统的 PA…

css属性计算过程

CSS 属性计算过程 你是否了解 CSS 的属性计算过程呢&#xff1f; 有的同学可能会讲&#xff0c;CSS属性我倒是知道&#xff0c;例如&#xff1a; p{color : red; }上面的 CSS 代码中&#xff0c;p 是元素选择器&#xff0c;color 就是其中的一个 CSS 属性。 但是要说 CSS 属…

丢失d3dcompiler47.dll怎么办,这个五个修复方法都可以解决

打开游戏或者软件的时候&#xff0c;电脑提示由于找不到d3dcompiler_47.dll&#xff0c;无法继续执行此代码怎么办&#xff0c;其实修复起来不难。首先需要先知道怎么是dll文件&#xff0c;dll文件可以简单的把库文件看成一种代码仓库&#xff0c;它提供给使用者一些可以直接拿…

【学习笔记】Spring Cloud

1、Spring Cloud简介&#xff1a; 成熟的微服务框架&#xff0c;定位为开发人员提供工具&#xff0c;以快速构建分布式系统 2、Spring Cloud核心组件 服务注册中心&#xff1a;Spring Cloud Netflix Eureka&#xff0c;会启动一个Eureka Serve&#xff0c;把其他的组件作为E…

Git分布式版本控制系统

Githttps://git-scm.com/ 1. Git简介 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。分布式相比于集中式的最大区别在于开发者可以提交到本地&#xff0c;每个开发者通过克隆&#xff08;git clone&#xff09;&#xff…

梳理Retrofit的知识体系

作者&#xff1a;RainyJiang 在学习Retrofit后&#xff0c;由于它本身就是OKHttp的封装&#xff0c;面试中也经常会被一起问到&#xff1b;单纯的解析它的源码学习难免会有点无从下手&#xff0c;往往让人抓不住重点&#xff0c;学习效率并不是很高&#xff0c;本文从提出几个问…

我的创作纪念日 2048 AI 面试 Java GoLang

《突击面试》 《面试1v1》 机缘 提示&#xff1a;可以和大家分享最初成为创作者的初心 例如&#xff1a; 实战项目中的经验分享日常学习过程中的记录通过文章进行技术交流… 收获 提示&#xff1a;在创作的过程中都有哪些收获 例如&#xff1a; 获得了多少粉丝的关注获得…

VMware Workstation 11 安装教程

哈喽&#xff0c;大家好。今天一起学习的是VMware Workstation 11的安装&#xff0c;vm虚拟机是小编非常喜欢的生产力软件&#xff0c;小编之前发布的测试教程钧在vm上进行的实验。 VMware Workstation是一款功能强大的桌面虚拟计算机软件&#xff0c;它能够让用户在宿主机操作…