面试经典150题【51-60】

文章目录

  • 面试经典150题【51-60】
    • 71.简化路径
    • 155.最小栈
    • 150.逆波兰表达式求值
    • 224.基本计算器
    • 141.环形链表
    • 2.两数相加
    • 21.合并两个有序链表
    • 138.随机链表的复制
    • 19.删除链表的倒数第N个节点
    • 82.删除链表中的重复元素II

面试经典150题【51-60】

71.简化路径

在这里插入图片描述
先用split(“/”)分开。然后依次放入栈中。如果遇到两个点,说明要返回上一级,要弹出一次栈。用栈的话函数是push和pop。注意pop之前要判断栈是否为空。最后按栈弹出顺序,逆序拼接即可。

public class LC71 {@Testpublic void test(){System.out.println(simplifyPath("/../"));}public String simplifyPath(String path) {Deque<String> stack=new LinkedList<>();String[] strings = path.split("/");for(String str:strings){if("..".equals(str)){if(!stack.isEmpty()){stack.pop();}}else if(!str.isEmpty() && !str.equals("/")){stack.push(str);}}String res = "";for (String d : stack)res = "/" + d + res;return res.isEmpty() ? "/" : res;}
}

155.最小栈

在这里插入图片描述
主要就是获取最小元素,我一开始想的是再搞个优先队列。后来看答案,发现两个栈也可以。
比如我在栈一塞入[ 1,2,3] ,那我在最小栈就塞入 [ 1,1,1] ,然后弹出的时候一起弹出就行。主要是在push的时候取个Math.min(x,minStack.top)

150.逆波兰表达式求值

在这里插入图片描述
用一个栈,数据往里面放。如果遇到运算符,则从栈中取出两个数据进行运算,然后再放回栈中。
最后栈里只剩下一个元素。即为答案。

224.基本计算器

在这里插入图片描述
每一个数字,都应该根据他前面的符号数量和种类,判断是乘以+1还是-1; 新建一个符号的栈,有左括号就push进去一个,有右括号就pop出来一个。stack 记录的是截止到这个左括号为止,前面的正负号应该为谁。
1+(2-(3+4))
先把ops=1; 碰到+号,ops=1; 碰到(,栈里为 1
碰到- ops=-1 又碰到左括号 栈里 1 -1
碰到右括号,弹出-1, 栈里 1

public class LC224 {@Testpublic void test(){System.out.println(calculate("(1+(4+5+2)-3)+(6+8)"));}public int calculate(String s){Deque<Integer> stack=new LinkedList<>();int i=0,ops=1,ans=0;stack.push(1);while(i<s.length()){if(' ' == (s.charAt(i))){i++;continue;}else if('+'==(s.charAt(i))){ops = stack.peek();i++;}else if('-' == (s.charAt(i))){ops=-stack.peek();i++;}else if('(' == (s.charAt(i))){stack.push(ops);i++;}else if(')' == (s.charAt(i))){stack.pop();i++;}else{//一个数字int temp=0;while(i<s.length() && Character.isDigit(s.charAt(i))){temp=temp*10+s.charAt(i)-'0';i++;}ans += ops * temp;}}return ans;}
}

141.环形链表

最经典的快慢指针。非常经典的一道题。不想赘述了。必会

2.两数相加

在这里插入图片描述
这个数字是逆序的,也就是说。2和5才是个位数。

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode pre=new ListNode();ListNode cur=pre;int carry=0;while(l1 !=null || l2 !=null){//只要有一个不为空就应该继续遍历,为空就是为0int val1=l1==null ? 0 : l1.val;int val2=l2==null ? 0 : l2.val;int sum=val1+val2+carry;cur.next=new ListNode(sum%10);//注意指针要移动cur=cur.next;carry=sum/10;//注意指针要移动if(l1 != null) l1=l1.next;if(l2 != null) l2=l2.next;}//最后一位的进位是否存在。if(carry == 1) cur.next=new ListNode(1);return pre.next;}

21.合并两个有序链表

在这里插入图片描述
从原则上来说应该是双指针遍历两个链表。但是也可以用递归去简化这个流程。
如果list1.val比较小的话,list1.next= merge( list1.next , list2)

class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {if(list1==null) return list2;if(list2==null) return list1;if(list1.val < list2.val){list1.next = mergeTwoLists(list1.next,list2);return list1;}else{list2.next=mergeTwoLists(list2.next,list1);return list2;}}
}

138.随机链表的复制

我们用哈希表来解决这个问题
首先创建一个哈希表,再遍历原链表,遍历的同时再不断创建新节点
我们将原节点作为key,新节点作为value放入哈希表中
在这里插入图片描述
第二步我们再遍历原链表,这次我们要将新链表的next和random指针给设置上

从上图中我们可以发现,原节点和新节点是一一对应的关系,所以

map.get(原节点),得到的就是对应的新节点
map.get(原节点.next),得到的就是对应的新节点.next
map.get(原节点.random),得到的就是对应的新节点.random
所以,我们只需要再次遍历原链表,然后设置:
新节点.next -> map.get(原节点.next)
新节点.random -> map.get(原节点.random)
这样新链表的next和random都被串联起来了
最后,我们然后map.get(head),也就是对应的新链表的头节点,就可以解决此问题了。

class Solution {public Node copyRandomList(Node head) {if(head==null) {return null;}//创建一个哈希表,key是原节点,value是新节点Map<Node,Node> map = new HashMap<Node,Node>();Node p = head;//将原节点和新节点放入哈希表中while(p!=null) {Node newNode = new Node(p.val);map.put(p,newNode);p = p.next;}p = head;//遍历原链表,设置新节点的next和randomwhile(p!=null) {Node newNode = map.get(p);//p是原节点,map.get(p)是对应的新节点,p.next是原节点的下一个//map.get(p.next)是原节点下一个对应的新节点if(p.next!=null) {newNode.next = map.get(p.next);}//p.random是原节点随机指向//map.get(p.random)是原节点随机指向  对应的新节点 if(p.random!=null) {newNode.random = map.get(p.random);}p = p.next;}//返回头结点,即原节点对应的value(新节点)return map.get(head);}
}

当然还有一种方法是将其变为 1->1’-> 2 -> 2’
然后再将其拆开为1’ -> 2’
不过拆开的函数有点小复杂:

 //第三步,将两个链表分离while(p!=null) {cur.next = p.next;cur = cur.next;p.next = cur.next;p = p.next;}

19.删除链表的倒数第N个节点

先用快慢指针找到倒数第N个,然后直接 slow.next = slow.next.next即可

82.删除链表中的重复元素II

在这里插入图片描述
比如对于1->2->2->2->3要变为1->3
设置虚拟节点0,当有两个数相同的时候,cur.next.val == cur.next.next.val
记录x=cur.next.val; 如果cur.next.val==x,则直接换下一个指针 cur.next=cur.next.next;
这样才能把第一个2也给消除掉。

class Solution {public ListNode deleteDuplicates(ListNode head) {if (head == null) {return head;}ListNode dummy = new ListNode(0, head);ListNode cur = dummy;while (cur.next != null && cur.next.next != null) {if (cur.next.val == cur.next.next.val) {int x = cur.next.val;while (cur.next != null && cur.next.val == x) {cur.next = cur.next.next;}} else {cur = cur.next;}}return dummy.next;}
}

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

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

相关文章

10. Nginx进阶-Return

简介 什么是Return&#xff1f; nginx的return指令是用于在nginx配置文件中进行重定向或返回特定的HTTP响应码的指令。 它可以根据不同的条件来执行不同的操作&#xff0c;如重定向到其他URL、返回指定的HTTP响应码或自定义响应内容等。 Return适用范围 return指令只能在se…

四平方和 刷题笔记

/* 四平方和 直接暴力搜索 可能会超时 使用二分辅助搜索 先枚举出 c*cd*d并存入数组 用式子算出 a*ab*b还剩下多少查找sum数组里面是否存在符合条件的数 查找方式使用二分搜索 当逼近答案后 检查一下是否为所需的数 如果是 直接输出 */ #include <cstring> #includ…

rabbitmq基础(1)

1、背景 能实现消息队列的框架软件有很多&#xff0c;kafka、rabbitmq、RocketMq、activeMq、Redis&#xff08;非专业&#xff09;&#xff0c;各有各的特点和优缺点。但是之前的公司数据需求规模并非很大&#xff0c;所以采用rabbitmq作为消息队列。 2、rabbitMq的基础架构…

大批量接口请求的前端优化

接到一个需求&#xff0c;需要做一个运维的功能&#xff0c;对公司下平台子系统做一个开关界面&#xff0c;要求可以大批量对系统进行修改。这样大批量的修改&#xff0c;如果有个老哥手一抖点了全选&#xff0c;那可能同时会发送几十上百个接口&#xff0c;对浏览器和服务器都…

C++面试宝典【配文档,全方面学习】

原word文档[链接: https://pan.baidu.com/s/1CKnm7vHDmHSDskAgxgZgKA?pwdr4wv 提取码: r4wv 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v5的分享] 一、C / C基础 1、简述C的内存分区&#xff1f; 一个C、C程序的内存分区主要有5个…

使用html网页播放多个视频的几种方法

前言 因为项目测试需要&#xff0c;我需要可以快速知道自己推流的多路视频流质量&#xff0c;于是我想到可以使用html网页来播放视频&#xff0c;实现效果极其简单&#xff0c;方法有好几种&#xff0c;以下是几种记录&#xff1a; 注意&#xff1a;测试过&#xff0c;VLC需要使…

Java:类加载器

参考 JavaGuide 简介 类加载器的主要作用是加载Java类的字节码即.class文件到JVM中。每个Java类都有一个引用指向加载它的类加载器。数组类是JVM直接生成而非加载的。根据需要动态加载&#xff0c;已加载的类放到ClassLoader中&#xff0c;相同二进制名称的类只会被加载一次…

C++从零开始的打怪升级之路(day43)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的是关于多态的知识点 1.多态的概念及定义&#xff0c;…

[Python] 添加重试机制来处理某些可能出现异常的函数

在 Python 中&#xff0c;如果你想要添加重试机制来处理某些可能出现异常的函数&#xff0c;可以使用 retry 装饰器。虽然 Python 标准库中没有提供内置的 retry 装饰器&#xff0c;但你可以使用第三方库 tenacity 来实现这个功能。 tenacity 是一个流行的 Python 库&#xff…

Ubuntu18.04运行ORB-SLAM3

ORB-SLAM3复现(ubuntu18) 文章目录 ORB-SLAM3复现(ubuntu18)1 坐标系与外参Intrinsic parameters2 内参Intrinsic parameters2.1 相机内参① 针孔模型Pinhole② KannalaBrandt8模型③ Rectified相机 2.2 IMU内参 3 VI标定—外参3.1 Visual calibration3.2 Inertial calibration…

STM32类别概述、下载程序及启动过程分析

STM32类别概述、下载程序及启动过程分析 STM32类别STM32下载程序STM32启动过程分析 STM32类别 STM32 目前总共有 5 大类&#xff0c;18 个系列 结合 STM32F1 的芯片来说&#xff0c;其 CMSIS 应用程序的简单结构框图&#xff0c;不包括实时操作系统和 中间设备等组件&#xf…

find函数-秒了道题

秒了 笑死 还是规规矩矩做吧 string类的find()函数用于在字符串中查找字符或子串&#xff0c;返回第一个匹配的位置。 class Solution { public:int strStr(string haystack, string needle) {return haystack.find(needle);} };

搜维尔科技:Manus Prime X系列手套介绍,由 PrimeXMarkerMocap 和Prime X Haptic VR 手套组成

搜维尔科技&#xff1a;Manus Prime X系列手套介绍&#xff0c;由 PrimeXMarkerMocap 和Prime X Haptic VR 手套组成 Manus Prime X&#xff08;点击进入官网&#xff09;系列手套介绍&#xff0c;由 PrimeXMarkerMocap 和Prime X Haptic VR 手套组成

深入理解操作系统Operator System(1)

目录 OS概念 设计OS的目的 OS定位 操作系统对下的结构层次示意图 理解操作系统的"管理"❗❗ "管理"被管理者的数据 怎么获取被管理者的数据 获取被管理者什么"数据" 数据过多&先描述再组织❗ C/C中的体现 解释OS对硬件的"管…

RabbitMQ(控制台模拟收发消息与数据隔离)

1.RabbitMQ架构图 publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 consumer&#xff1a;消费者&#xff0c;也就是消费消息的一方 queue&#xff1a;队列&#xff0c;存储消息。生产者投递的消息会暂存在消息队列中&#xff0c;等待消费者处理 exchange&…

获取数据库最新的一条打卡时间数据SQL语句

获取数据库最新的一条打卡时间数据SQL语句 上班表创建SQL语句 CREATE TABLE "PunchIn" ("id" INT NOT NULL,"emp_code" VARCHAR(50) NOT NULL COLLATE Chinese_PRC_CI_AS,"punch_in_time" DATETIME NOT NULL,"status" VAR…

Java 抽象类与方法:实现安全性与代码重用

Java 内部类 简介 在 Java 中&#xff0c;可以嵌套类&#xff08;即类内部的类&#xff09;&#xff0c;称为内部类。嵌套类的目的是将属于一起的类分组&#xff0c;从而使您的代码更可读和可维护。 访问内部类 要访问内部类&#xff0c;请创建外部类的对象&#xff0c;然后…

c语言-函数-009

2.函数传参: 2.1赋值传递&#xff08;复制传递&#xff09;函数体内部想要使用函数体外部变量值的时候使用复制传递2.2全局变量传递#include <stdio.h>int Num1 100; int Num2 200; int Ret 0;void Add(void) {Ret Num1 Num2;return; }int main(void) {Add();printf…

深度解析速卖通商品详情API:Python实战与高级技术探讨

速卖通商品详情API接口实战&#xff1a;Python代码示例 一、准备工作 在开始之前&#xff0c;请确保你已经完成了以下步骤&#xff1a; 在速卖通开放平台注册账号并创建应用&#xff0c;获取API密钥。阅读速卖通商品详情API接口的文档&#xff0c;了解接口的使用方法和参数要…

什么是物联网?物联网如何工作?

物联网到底是什么&#xff1f; 物联网(Internet of Things&#xff0c;IoT)的概念最早于1999年被提出&#xff0c;官方解释为“万物相连的互联网”&#xff0c;是在互联网基础上延伸和扩展&#xff0c;将各种信息传感设备与网络结合起来而形成的一个巨大网络&#xff0c;可以实…