12.9 总结

news2024/12/25 0:30:44

一.复制带有随机指针的链表

要求结构和val都是一样

这个题目我们可以建立一个map表,把新的链表和旧的链表每个节点都构成一组key-val对应

然后遍历旧链表.找到对应的next值和random'值

思路:

方法1:迭代+map

class Solution { public Node copyRandomList(Node head) { if(head==null) return null; Node cur =head;//建立一个先驱节点遍历链表 Map<Node,Node> map=new HashMap<>(); while(cur!=null){ Node node=new Node(cur.val); map.put(cur,node);//放到map表里 cur=cur.next; } cur=head; while(cur!=null){ map.get(cur).next=map.get(cur.next); map.get(cur).random=map.get(cur.random); cur=cur.next; } return map.get(head); } }

方法二 递归

将hash表放在外,防止每次递归都改变表,

每次递归前看是否有head.表里没有就直接返回head对应的headNEW的值

如果没有,就建立对应的节点

并把对应的kv放进去

新的节点的下一个和随机值都进入下一个递归.

class Solution { Map<Node,Node> map=new HashMap<>(); public Node copyRandomList(Node head) { if(head==null) return null; while(!map.containsKey(head)){ Node headNew=new Node(head.val); map.put(head,headNew); headNew.next=copyRandomList(head.next); headNew.random=copyRandomList(head.random); } return map.get(head); } }

复杂度分析

时间复杂度:O(n)O(n),其中 nn 是链表的长度。对于每个节点,我们至多访问其「后继节点」和「随机指针指向的节点」各一次,均摊每个点至多被访问两次。

空间复杂度:O(n)O(n),其中 nn 是链表的长度。为哈希表的空间开销。

方法3直接复制

思路:新节点接在老节点之后,连接新随机指针,分离链表

这里解释如何复制的步骤。 图中,黄色为新节点,蓝色为老节点。

1:原始链表,含随机指针,这里仅显示两个,画多了自己看着也乱。

2.2:在每一个老节点之后,新建与老节点val相同的节点,插入在老节点之后,注意,随机指针不急赋值,因为随机在何处还不知,需要把链表全部新老节点建立连接完成。

3:赋值新随机指针,等于为老随机指针的下一个。

4:拆分链表。随机指针不受影响,老链表依然在,新链表复制完成

5:最后结果

class Solution { public Node copyRandomList(Node head) { if(head==null) return null; Node pHead=head;//建立指针 连接链表 while(pHead!=null){ Node copyNode=new Node(pHead.val); copyNode.next=pHead.next; pHead.next=copyNode; pHead=pHead.next.next; } //建立随机指针 pHead=head; Node randompHead=pHead.next;//对应新节点的位置,为什么定义在外面,因为最后一个节点一定遍历不到(链表总数是偶数),需要额外遍历 while(randompHead.next!=null){ if(pHead.random!=null) randompHead.random=pHead.random.next; pHead=pHead.next.next; randompHead=randompHead.next.next; } if(pHead.random!=null){ randompHead.random=pHead.random.next; }//处理最后一个情况; //分离链表 Node pre=new Node(1); Node newHead=pre;//防止后期找不到头结点 pHead=head; while(pHead!=null){ pre.next=pHead.next; pre=pre.next; pHead.next=pre.next;//分离 pHead=pHead.next; } return newHead.next; }

二.宝石与石头

用set做.因为set是一个不重复集合

class Solution { public int numJewelsInStones(String jewels, String stones) { Set<Character> set=new HashSet<>(); for(char s:jewels.toCharArray()){ set.add(s); } int count=0; for(char s:stones.toCharArray()){ if(set.contains(s)){ count++; } } return count; } }

三.坏键盘打字

这里的
是前端换行的意思

要求输出大写,且按照发现顺序

观察一下,可以发现没有输出的7ti不管大写小写都没办法输出,就说明我们可以先把变成大写.统一处理

定义两个集合,一个是放在是实际输出的,

还有一个是坏的建.因为可能坏的字母重复出现多次,

并且一旦出现坏的,我们就打印,因为这是一个hashset 顺序不是按照发现顺序来的

方法1 set方法

import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); String s1=sc.nextLine();//好的 String s2=sc.nextLine();//实际输出的 Set<Character> badset=new HashSet<>(); Set<Character> goodset=new HashSet<>(); for(char ch:s2.toUpperCase().toCharArray()){ goodset.add(ch); } for(char ch:s1.toUpperCase().toCharArray()){ if(!goodset.contains(ch)&&!badset.contains(ch)){ System.out.print(ch); badset.add(ch); } } } }

方法2 sb做法

遍历好的 如果有在好的中没有的,或者在sb里也没有的就拼接到sb里

这里注意,sb没有indexof 需要tostring

import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); String s1=sc.nextLine().toUpperCase(); String s2=sc.nextLine().toUpperCase(); StringBuilder sb=new StringBuilder(); // char[] ch1=s1.toUpperCase().toCharArray(); // char[] ch2=s2.toUpperCase().toCharArray(); for(int i=0;i<s1.length();i++){ if(s2.indexOf(s1.charAt(i))==-1&&sb.toString().indexOf(s1.charAt(i))==-1){ System.out.print(s1.charAt(i)); sb.append(s1.charAt(i)); } } } }

方法三 map法

yuset法大同小异

public class B1019OldKeyboard { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String old = sc.next(); String result = sc.next(); Map<Character, Integer> mapResult = new HashMap<>(); Map<Character, Integer> mapOld = new HashMap<>(); char[] charsResult = result.toUpperCase().toCharArray(); char[] charsOld = old.toUpperCase().toCharArray(); for (int i = 0; i < charsResult.length; i++) { if (!mapResult.containsKey(charsResult[i])) { mapResult.put(charsResult[i], i); } } List<Character> list = new ArrayList<>(); for (int i = 0; i < charsOld.length; i++) { if (!mapResult.containsKey(charsOld[i])) { if (!mapOld.containsKey(charsOld[i])) { mapOld.put(charsOld[i], i); list.add(charsOld[i]); } } } for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i)); } } }

四.前k个高频单词

这题的思路就是遍历字符数组,建立一个map表,把对应的单词和对应的频率放在堆里

怎么样存储k-v

就要用

他也属于一个类,

因为我们是小根堆,但是这里有两个值,我们需要new一个comparator

我们来自己指定是key还是value很显然是频率

然后遍历map

用foreach循环

小于k的时候就把map的值放进去

大于map的时候,

就看堆顶元素是否小于entry.是就弹出来,让entry放进去

这样写当然错了.要看对应的频率

这里还是错了.我们要先判断相同的情况,

这里错了,Integer是引用类型不能用==比较

然后频率相同我们比较单词大小

频率不同我们找频率大的

到这里我们发现出现了错误,我们弹出的结果没有逆置.所以应该要把list逆置一下

只要用集合的工具类就行

这里发现测试用例虽然通过多了

还是出现了问题

我们分析一下

这里可能我们放了三个,就没进行,后面的交换,直接跳出循环,遍历完map表了

那么我们会发现,问题出现在了这里

你小于k的时候,你就直接放入

根据这个比较方法比较

这样是没问题的,但是后续又逆置,把逆置回来了.

没有按照字母排序

解决方法

就是要让字母大的放在堆顶.结束的时候逆置就变成正的了

所以我们需要改变一下比较方法

class Solution { public List<String> topKFrequent(String[] words, int k) { //1.统计每个单词出现的次数用map Map<String,Integer> map=new HashMap<>(); for (String s:words) { if(!map.containsKey(s)){ map.put(s,1); }else{ int freq=map.get(s); map.put(s,freq+1); } } //2.建立一个大小为k的小根堆 PriorityQueue<Map.Entry<String,Integer>> minHeap=new PriorityQueue<>(k, new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { if(o1.getValue().compareTo(o2.getValue())==0){ return o2.getKey().compareTo(o1.getKey());//根据字符串比较的大根堆 } return o1.getValue()-o2.getValue();//根据频率比较 } }); //3.遍历map表 for(Map.Entry<String,Integer> entry:map.entrySet()){ if(minHeap.size()<k){ minHeap.offer(entry); }else{ Map.Entry<String,Integer> top=minHeap.peek(); if(top.getValue().compareTo(entry.getValue())==0){ if(top.getKey().compareTo(entry.getKey())>0){//entry的单词更小 minHeap.poll(); minHeap.offer(entry); } }else{ if(top.getValue().compareTo(entry.getValue())<0){ minHeap.poll(); minHeap.offer(entry); } } } } List<String> list=new ArrayList<>(); while(!minHeap.isEmpty()){ Map.Entry<String,Integer> top=minHeap.poll(); list.add(top.getKey()); } Collections.reverse(list); return list; } }

五.二叉搜索树

1 概念

二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:

若它的左子树不为空,则左子树上所有节点的值都小于根节点的值

若它的右子树不为空,则右子树上所有节点的值都大于根节点的值

它的左右子树也分别为二叉搜索树

int a [] = {5,3,4,1,7,8,2,6,0,9};

2 操作-查找

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

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

相关文章

Mysql 8.0.31彻底卸载

我们有时需要将mysql卸载重新安装&#xff0c;然而如果不注意其中的细节&#xff0c;只是使用apt remove mysql-server命令是卸载不干净的&#xff0c;即使使用了apt purge mysql-server命令进行卸载再重新安装的mysql还是会保留着原来的密码。正确的操作方式是下面这样子的。 …

百度智能云发布基于Ampere® Altra®的高能效云服务器GR1实例

2021年&#xff0c;百度公布了2030年碳中和目标以及6条科学实现路径。首要举措便是建设更环保的数据中心。百度自建的数据中心PUE一直处于非常领先的位置。百度一直秉持“科技为更好”的可持续发展理念&#xff0c;依托全栈和领先的人工智能技术和丰富的产业实践&#xff0c;在…

前端项目工程化流程(简陋版)

背景 最近想要自己做开始一个项目&#xff0c;然后发现好像挺久没有出 从 0 开始 一个项目了&#xff0c;对项目的一些工程化方面的流程有点生疏了&#xff0c;感觉就是知道一个大概的流程&#xff0c;很多都要靠搜索引擎来帮忙&#xff0c;我就想整理一下&#xff0c;对于前端…

在node.js中使用​ JsonWebToken模块进行token加密

目录 一、token 1、什么是token 2、作用 二、Express中实现token的方法&#xff1a; 1、使用JWT模块&#xff1a;JsonWebToken 2、token验证的流程 3、Express中实现过程 ​ &#xff08;1&#xff09;安装、导入JsonWebToken模块 ​ &#xff08;2&#xff09;在登录…

stm32f767之PWM

仅作笔记&#xff0c;很多内容参考网友文章。 PWM 输出&#xff0c;是利用定时器的比较输出功能&#xff0c;所以就是配置定时器。 1&#xff0c;选择定时器8 tim1和tim8为高级定时器 一般我们选择内部时钟&#xff0c;也就是由APB 外设时钟提供。根据选择的输出IO口&#x…

手把手教你搭建视频去重系统

#01 背景 如今&#xff0c;短视频平台对各类搬运视频的检测力度和精确度越来越高了。无论是影视号的剪辑&#xff0c;还是从油管搬运&#xff0c;即使做了各类复杂的视频变换&#xff0c;都很容易被检测出来。作者都会收到提醒&#xff0c;严重的甚至被封号。 乔布斯演讲原始视…

您公司的财务流程是世界一流的还是二流的?

您公司的财务流程是世界一流的还是二流的&#xff1f; 组织开始意识到&#xff0c;提高财务和会计流程的有效性和效率不仅是财务部门内部的目标&#xff0c;而且对整个公司的战略目标也意义重大。首席财务官必须扪心自问——我们的财务流程是世界一流的还是二流的&#xff0c;…

Mac安装NDK android-ndk-r25b-darwin.dmg

文章目录废话连片教程片段1. 打开要存放的目录.2. 打开 .app 的包内容配置环境变量 MAC (在终端/cmd/命令行中运行)废话连片 最近在用 xx存图 下载 小蓝鸟、油管 视频, 一开始觉得挺好用的, 直到… 免费下载次数已用完. 就想着自己弄一个下载视频的小工具, 便查询到了 python …

基于JavaWeb的宿舍管理系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

网页设计期末课程大作业:基于HTML+CSS+JavaScript+Bootstrap制作响应式网站信息技术交流博客(7页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

gradle的访问目录和支付宝的注意事项

经过我100多次的测试发现。gradle项目不管是打包 还是不打包。他的访问目录都是 config.class.getResourceAsStream("config.properties") 当前class所在的目录&#xff0c; 而支付宝的sdk。他的访问文件的目录是项目的根目录。 比如 你的项目文件是这个样子。运…

QT-自定义本地翻译模块,简单实用

QT-自定义本地翻译模块&#xff0c;简单实用前言一、演示效果二、核心模块1.本地xml的操作过程2、翻译模块三、程序链接前言 QT的国际语言每次如果有字符串变动&#xff0c;都需要重新再编译一下&#xff0c;真的是顶不住&#xff0c;说实话&#xff0c;用起来真的是不习惯。 …

DataX-Web 源码调试及打包

文章目录1、还原 dataxweb 数据库2、修改配置文件3、打包前文回顾&#xff1a; 《DataX 及 DataX-Web 安装使用详解》 《DataX 源码调试及打包》 源码地址&#xff1a;https://github.com/WeiYe-Jing/datax-web 1、还原 dataxweb 数据库 sql 脚本在目录 /bin/db/datax-web.sq…

Keycloak之17.0.1 版本与Jenkins安装与集成-yellowcong

jekins和keycloak的认证,是依赖于 Keycloak Authentication Plugin 插件,进行认证处理,这个配置还是相对比较简单的,最坑的一点就是如果配置错误了,如何恢复的问题。 keycloak 应用集成 Keycloak之安装与启动-yellowcong Keycloak之功能介绍与简单使用-yellowcong Keyc…

BW取月底月初日期函数

BW取月底内置的函数与SAP有差异&#xff0c;为 SN_LAST_DAY_OF_MONTH&#xff0c;如下 很简单的逻辑&#xff0c;主要通过2月的日期进行判断为平年还是闰年&#xff0c;其他月末日期固定 取月底函数&#xff1a; call function SN_LAST_DAY_OF_MONTH EXPORTING DAY_IN …

如何下载不同格式的卫星地图

如何下载不同格式的卫星地图 发布时间&#xff1a;2018-01-17 版权&#xff1a; 务名称&#xff1a;下载任务的名称&#xff0c;可重命名 经纬度范围当前下载区域所在的经纬度范围&#xff0c;不可更改 保存路径&#xff1a;下载你选择区域的文件保存的地方&#xff0c;可更…

基于jsp+mysql+ssm在线培训教育平台-计算机毕业设计

项目介绍 本在线培训教育课程平台系统主要包括系统用户管理模块、课程类别管理模块、课程信息管理、站内新闻管理、登录模块、和退出模块等多个模块。它帮助在线教育平台实现了信息化、网络化&#xff0c;通过测试&#xff0c;实现了系统设计目标,系统采用了jsp的mvc框架,SSM(…

Allegro如何检查过孔类型是否使用正确操作指导

Allegro如何检查过孔类型是否使用正确操作指导 Allegro可以检查PCB上过孔类型是否使用正确,让使用错误的过孔以DRC的形式报出来,具体操作如下 选择setup-Constraint-modes 出现Analysis mode的窗口,选择Physical Modes,Vialist DRC选择on开关,并且保证On-line DRC是勾选…

【数据结构】堆的实现(向上、下调整比较,复杂度,堆排序,Top-K问题)

文章目录一、堆的实现1、堆的概念2、堆的性质3、堆的实现堆的创建&#xff08;向上、下调整比较&#xff09;堆排序Top-K&#xff08;读取文件当中的数据&#xff09;一、堆的实现 1、堆的概念 如果有一个关键码的集合K {k0&#xff0c;k1&#xff0c; k2&#xff0c;…&…

餐饮行业的成本率与毛利率

1、成本率与毛利率 成本率是指成本量与营业额&#xff08;销售额&#xff09;之间的比率&#xff0c;表示实现一定量的销售额需要多少比例的成本资源消耗。 成本率越低&#xff0c;表示企业实现单位业绩付出的资源代价越小&#xff0c;释放出的收益空间越大&#xff1b;相反&a…