秋招突击——7/22——复习{堆——前K个高频元素}——新作{回溯——单次搜索、分割回文串。链表——环形链表II,合并两个有序链表}

文章目录

    • 引言
    • 复习
      • 堆——前K个高频元素
        • 个人实现
        • 复习实现二
        • 参考实现
    • 新作
      • 单词搜索
        • 个人实现
        • 参考实现
      • 分割回文串
        • 个人实现
        • 参考实现
      • 环形链表II
        • 个人实现
        • 参考实现
      • 两个有序链表
        • 个人实现
    • 总结

引言

  • 又是充满挑战性的一天,继续完成我们的任务吧!继续往下刷,一场面试三个构成:八股、项目和算法,都得抓住!加油
  • 今天复习一下堆,然后把回溯剩下的题目全部做完,然后的继续往下做链表!

复习

  • 对顶堆——数据流的中位数
    • front是大顶堆,back是小顶堆

堆——前K个高频元素

  • 题目链接
  • 第一次练习链接
  • 第二次练习链接
  • 虽然已经做了两次,但是一点都想不起来应该怎么做!
个人实现
  • 这道题可以通过设置不同的数据结构实现,通过key-value改变记录每一个数字出现的频率,然后通过PriorityQueue来实现根据频率进行排序,这样效率就快很多!那么怎么实现自定义排序就很重要!
class Solution {class Item implements Comparable<Item>{int val;int freq;Item(int value,int frequency){val = value;freq = frequency;}// override the compareTo function@Overridepublic int compareTo(Item o){return Integer.compare( this.freq,o.freq);}}public int[] topKFrequent(int[] nums, int k) {// define map to store the key-value item ,priorityqueue to sort the itemPriorityQueue<Item> pq = new PriorityQueue<>(Comparator.reverseOrder());Map<Integer,Item> map = new HashMap<>();// traverse all the elementsfor(int x :nums){if(map.containsKey(x)){Item temp = map.get(x);temp.freq = temp.freq + 1;System.out.println(map.get(x).freq);}else{Item temp = new Item(x,1);map.put(x,temp);pq.add(temp);}}// traverse the front k elementsint[] res = new int[k];//System.out.println(pq.peek().val);for(int i = 0;i < k;i ++)res[i] = pq.poll().val;return res;}
}

问题

  • 如何重写对象compare方法
    • 要实现Comparable接口
    • compareTo方法是接受当前类型的变量,进行的比较
    • compareTo方法,返回的是一个int类型的变量
    • 实现comparable接口,需要实现compareTo方法
class Item implements Comparable<Item> {int val;int freq;Item(int value, int frequency) {val = value;freq = frequency;}// override the compareTo function@Overridepublic int compareTo(Item o) {return Integer.compare(o.freq, this.freq); // descending order}
}

在这里插入图片描述

  • 致命问题!!PriorityQueue并不会自动重新排序!需要每次更新都要插入和删除对应的元素,不然会出问题!

在这里插入图片描述

复习实现二
  • 这里不知道自己着了什么魔,这个题目为啥要想的那么复杂,不就是先统计频率,然后再根据频率进行排序吗?为什么要想那么多!
class Solution {class Item implements Comparable<Item>{int val;int freq;Item(int value,int frequency){val = value;freq = frequency;}// override the compareTo function@Overridepublic int compareTo(Item o){return Integer.compare( this.freq,o.freq);}}public int[] topKFrequent(int[] nums, int k) {// define map to store the key-value item ,priorityqueue to sort the itemPriorityQueue<Item> pq = new PriorityQueue<>(Comparator.reverseOrder());Map<Integer,Item> map = new HashMap<>();// traverse all the elementsfor(int x :nums){if(map.containsKey(x)){Item temp = map.get(x);temp.freq = temp.freq + 1;}else{map.put(x,new Item(x,1));}}// traverse the values int the for(Item x:map.values()){pq.add(x);}// traverse the front k elementsint[] res = new int[k];//System.out.println(pq.peek().val);for(int i = 0;i < k;i ++)res[i] = pq.poll().val;return res;}
}

在这里插入图片描述
问题

  • 这里Map的相关方法使用起来还是带有试验的性质,很多方法当时写了就错了,编译器提醒没有这种方法,才知道应该换!这里再复习一遍!
  • 加入元素:
    • put(K key,V value)
    • 如果存在旧值,会将其替换
    • 注意,没有set方法,那是list才有的
  • 获取对应的value
    • get(Object key)
    • 如果不含有对应的key,就返回null
  • 删除对应的元素
    • remove(Object key)
  • 判定是否含有对应的元素
    • containsKey(Obejct key)
    • 是containsKey,contains是Set的方法
  • 判定是否为空
    • isEmpty
    • 不是Empty,每次都写错
  • 获取所有value
    • values
    • 这里是返回所有的values,不是valueset
  • 获取所有的key
    • keySet
    • 不是keys
参考实现

使用计数排序

  • 将所有出现的频次记录在对应的数组中,然后根据索引进行遍历,减少遍历的时间!

这里就不记录了,如果感兴趣,就自己去看!

限定堆使用的大小

  • 如果直接将所有的元素加入到堆中进行排序,需要消耗很多时间,这里只要前K个元素,所以只需要维护一个大小为K的堆就行了!
class Solution {class Item implements Comparable<Item>{int val;int freq;Item(int value,int frequency){val = value;freq = frequency;}// override the compareTo function@Overridepublic int compareTo(Item o){return Integer.compare( this.freq,o.freq);}}public int[] topKFrequent(int[] nums, int k) {// define map to store the key-value item ,priorityqueue to sort the itemPriorityQueue<Item> pq = new PriorityQueue<>();Map<Integer,Item> map = new HashMap<>();// traverse all the elementsfor(int x :nums){if(map.containsKey(x)){Item temp = map.get(x);temp.freq = temp.freq + 1;}else{map.put(x,new Item(x,1));}}// traverse the values int the for(Item x:map.values()){if(pq.size() < k)pq.add(x);else{if(pq.peek().freq < x.freq){pq.poll();pq.add(x);}}}// traverse the front k elementsint[] res = new int[k];//System.out.println(pq.peek().val);for(int i = 0;i < k;i ++)res[i] = pq.poll().val;return res;}
}

在这里插入图片描述

新作

单词搜索

题目链接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意

  • 整个二维矩阵的大小可能是一个单元格,仅仅只有一个字母,可能是边界情况需要特殊处理。
  • 目标单词的长度是遍历的深度,也就是遍历树的高度,然后上下左右是四个方向,是每一层遍历的宽度。
个人实现
  • 这道题是典型的回溯,回溯的要素设定如下
    • idx 界限值是 单词的长度
    • 每一层遍历的宽度是上下左右四个方向
    • 需要维护一个exist数组,标记每一个元素的访问情况。
class Solution {// define the global string to store the mid situationStringBuilder str = new StringBuilder();// exist matrix to store the attendenceboolean[][] exist ;//boolean res = false;int[][] step = {{1,0},{0,1},{-1,0},{0,-1}};boolean dfs(char[][] board,String word,int idx,int x,int y){if(idx == word.length()){return true;}for(int i = 0;i < 4;i ++){int xNext = x + step[i][0];int yNext = y + step[i][1];if(xNext >= 0 && xNext < board.length ){if(yNext >= 0 && yNext < board[0].length){if(!exist[xNext][yNext] && board[xNext][yNext] == word.charAt(idx)){exist[xNext][yNext] = true;if(dfs(board,word,idx + 1,xNext,yNext)) return true;exist[xNext][yNext] = false;}}}}return false;}public boolean exist(char[][] board, String word) {//define row and col of the matrixint row = board.length;int col = board[0].length;exist = new boolean[row][col];// traverse the board to find the first charfor(int i = 0;i < board.length;i ++){for(int j = 0;j < board[0].length;j ++){if(board[i][j] == word.charAt(0)){//System.out.println("first " + board[i][j]);exist[i][j] = true;if(dfs(board,word,1,i,j)) return true;exist[i][j] = false;}}}return false;}
}

在这里插入图片描述
代码量真多,不过还是在规定时间内完成了!

参考实现

这里可以将融合到原来的数组中,通过修改特殊的字符,然后判定当前位置是否已经访问过!

分割回文串

题目链接

在这里插入图片描述
注意

  • 回文串,逆序和顺序都是一样的
  • 仅由小写字母构成,不用担心字母大小写变换
  • 长度是1到16,可能有边界情况需要特殊考虑!
个人实现
  • 这道题是一个组合体,找到所有的组合,然后在判断一下,是否是回文就行了。
  • 总结一下回溯的几个要素
    • 树的深度:总的元素数量
    • 节点的宽度:每一个节点放或者不放两种情况。

错误!!这里审错题目了!是分割字符串,应该然后分割之后每一个字串都是回文

  • 修改一下回溯的几个要素
    • 树的深度:分割的位置,总的元素数减一,每一个元素都有一个分割点
    • 节点的宽度:是否在当前点进行分割
class Solution {List<String> list = new ArrayList();List<List<String>> res = new ArrayList<>();boolean judge(String str){str = str.trim();StringBuilder sb = new StringBuilder(str);sb.reverse();return str.equals(sb.toString());}void dfs(StringBuilder s,int idx,int len){if(idx == len ){if(judge(s.toString())){list.add(s.toString());res.add(new ArrayList(list));list.remove(list.size() - 1);}return;}// cutint subIdx = len - s.length();String temp = s.substring(0,idx - subIdx);//System.out.print("idx:" + idx + "  temp:" + s.substring(0,idx - subIdx));if(judge(temp)){list.add(temp);//System.out.println("  subtemp:" + s.substring(idx - subIdx));dfs(new StringBuilder(s.substring(idx - subIdx)),idx + 1,len);list.remove(list.size() - 1);}// not cutdfs(s,idx + 1,len);}public List<List<String>> partition(String s) {dfs(new StringBuilder(s),1,s.length());return res;}
}

在这里插入图片描述

问题

  • StringBuilder获取子串是substring,没有大写,而且也没有简称,不是subString,不是subStr ,都不是!!是substring

    • substring(strat_idx):从start_idx到末尾
    • substring(start_idx,end_idx):从start_idx到end_idx这段子串 ,不包括end_idx,相当于在end_idx前面一个字符做的分割点
  • String去除空格

    • str.trim()去除前后空格
    • str.replace(" “,”");
    • 正则表达式replaceAll(“\s+”, “”)
  • 我这里回溯的角度可能有问题,导致时间上有很多耗费!

参考实现

暴力搜索 + 迭代优化

暴力搜索

  • 这里举得是区间长度,也就是区间起点,然后列举区间的终点,不同于我们列举每一个分割点!
  • 迭代深度
    • 每一区间的起点的位置
  • 单次迭代的宽度
    *

迭代优化

  • 利用了回文字符串的中间子串也一定是回文字符串的特性,具体如下图!
for(int j = 0;j < n;j ++){for(int i = 0;i <= j;i ++){if(i == j)	f[i][j] = true;else if(s[i] == s[j]){if(i + 1 > j -1 || f[i + 1][j - 1])	f[i][j] = true;}}
}

具体实现代码

class Solution {boolean[][] f;List<String> list = new ArrayList();List<List<String>> res = new ArrayList<>();void dfs(String s,int idx){int m = s.length();if(idx == m){res.add(new ArrayList(list));return ;}for(int i = idx ;i < m; i++){if(f[idx][i]){//System.out.println("idx:" + idx + " i" + i + " substr:"+s.substring(idx,i+1));list.add(s.substring(idx,i + 1));dfs(s,i+1);list.remove(list.size() - 1);}}}public List<List<String>> partition(String s) {int m = s.length();f = new boolean[m][m];for(int j = 0;j < m;j ++){for(int  i = 0;i <= j;i ++){if(i == j)  f[i][j] = true;else if(s.charAt(i) == s.charAt(j)){if(i + 1 > j - 1 || f[i + 1][j - 1])    f[i][j] = true;}}}dfs(s,0);return res;}
}

在这里插入图片描述
确实更快,那个回文推导的得稍微记一下!

环形链表II

  • 题目连接
    在这里插入图片描述
    在这里插入图片描述
    注意
  • pos表示-1或者有效索引
  • 不用担心数字越界
  • 空间复杂度要求是O(1)
个人实现
  • 这个明显是用快慢指针,首先判定是否有环,然后在有环的情况下,判定出对应环的起始点!
  • 难点在第二步,不过感觉这个环的起始点,之前好像做过。感觉快慢节点在有环的情况下,应该有特殊情况!

这里还是不知道怎么推导出来的,这题挂了!

如果不强制要求空间复杂度的话,只需要一次遍历就能实现!

这里就不写了,没什么意思!

参考实现
  • 这里推导的比较绕,我看了很多遍,总结起来就是一句话
    • 快慢指针相遇的地方,和链表的头节点分别同时触发一个速度为1的节点遍历,相遇点就是入点

先套一个快慢指针的模板

while(f != null){f = f.next;s = s.next;if(f == null)	return false;f = f.next;if(f == s)	return true;
}

最终实现代码

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {if(head == null || head.next == null)   return null;ListNode s = head;ListNode f = head.next;// judge whether contains circlewhile(f != null){f = f.next;s = s.next;if(f == null)   return null;f = f.next;if(f == s){s = head;f = f.next;while(s != f)   {s = s.next;f = f.next;}return s;}}return null;}
}

两个有序链表

  • 题目链接
    在这里插入图片描述
    在这里插入图片描述
  • 第一次练习连接
个人实现
  • 这个题目第二次做了,而且是个简单题,直接遍历就行了
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode head1 = list1;ListNode head2 = list2;ListNode dummy = new ListNode();ListNode temp = dummy;while(head1 != null && head2 != null){if(head1.val < head2.val){temp.next = head1;head1 = head1.next;temp = temp.next;}else{temp.next = head2;head2 = head2.next;temp = temp.next;}}temp.next = (head1 == null ? head2:head1);return dummy.next;}
}

在这里插入图片描述

题目很简单,但是让我想到了某一次字节的面试,面试官觉得我代码写的太差了,那道题是一个大数加法,使用链表表示的,我最后写的太差了!毕竟我已经换了三道题,感觉完蛋了!

总结

  • 今天状态不得行,刷到了第三题,我就厌烦的不行,不过还是得调整一下!
  • 真的是,每天刷题,刷的恶心,恶心的不行!后续还是得加油!
  • 又搞到好晚,我要睡了!
  • 明天面试百度,加油!

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

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

相关文章

WebRTC QoS方法十三.2(Jitter延时的计算)

一、背景介绍 一些报文在网络传输中&#xff0c;会存在丢包重传和延时的情况。渲染时需要进行适当缓存&#xff0c;等待丢失被重传的报文或者正在路上传输的报文。 jitter延时计算是确认需要缓存的时间 另外&#xff0c;在检测到帧有重传情况时&#xff0c;也可适当在渲染时…

【目标检测实验系列】EMA高效注意力机制,融合多尺度特征,助力YOLOv5检测模型涨点(文内附源码)

1. 文章主要内容 本篇博客主要涉及多尺度高效注意力机制&#xff0c;融合到YOLOv5s模型中&#xff0c;增加模型提取多尺度特征的能力&#xff0c;助力模型涨点。&#xff08;通读本篇博客需要7分钟左右的时间&#xff09;。 2. 简要概括 论文地址&#xff1a;EMA论文地址 如下…

Blender材质-PBR与纹理材质

1.PBR PBR:Physically Based Rendering 基于物理的渲染 BRDF:Bidirection Reflectance Distribution Function 双向散射分散函数 材质着色操作如下图&#xff1a; 2.纹理材质 左上角&#xff1a;编辑器类型中选择&#xff0c;着色器编辑器 新建着色器 -> 新建纹理 -> 新…

音视频入门基础:H.264专题(17)——FFmpeg源码获取H.264裸流文件信息(视频压缩编码格式、色彩格式、视频分辨率、帧率)的总流程

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

【开源库编译 | zlib】 zlib库最新版本(zlib-1.3.1)在Ubuntu(Linux)系统下的 编译 、交叉编译(移植)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

《书生大模型实战营第3期》入门岛 学习笔记与作业:Git 基础知识

文章大纲 Git 是什么&#xff1f;-- 分布式版本控制系统版本控制系统简介Git 基本概念1. 安装 Git1.1 Windows 系统1.2 Linux 系统 2. Git 托管平台3. 常用 Git 操作4. tips4.1 全局设置 vs. 本地设置4.2 如何配置4.3 验证设置4.4 Git 四步曲 5. 常用插件6. 常规开发流程 作业其…

js+css侧边导航菜单 可收缩

jscss侧边导航菜单 可收缩https://www.bootstrapmb.com/item/14774 创建一个可收缩的侧边导航菜单需要使用JavaScript来处理交互&#xff0c;而CSS则用来设置样式和动画效果。以下是一个简单的示例&#xff0c;展示了如何创建一个可收缩的侧边导航菜单。 HTML 结构 html<!…

重修之路1

我也不知道我现在处于个什么状态&#xff0c;我在以前写代码时知道部分方法如何使用&#xff0c;但是也仅限于此我并不了其如何实现&#xff0c;让我感到迷茫我是越来越菜了随着AI的发展它写出的代码简洁高效甚至让我有些看不懂&#xff0c;以至于我开始怀疑自己的JS基本功因此…

【接口测试】params传参与body传参区别

文章目录 一.params传参二.body传参三.两者区别说明 一.params传参 params传参一般用于get请求 params传参时,参数会附于URL后面以问号形式展示。 示例&#xff1a; http://ip地址:端口号/login?usernamexm&pwd111二.body传参 body传参一般用于post请求 body传参时需…

MacOS安装SDKMan管理Java版本

文章目录 1 简介2 安装与卸载2.1 安装2.2 卸载 3 使用3.1 查看其他工具&#xff1a;支持 Ant, Maven 等3.2 查看Java版本3.3 安装Java&#xff0c;加上相关的版本3.4 设置Java版本(全局)3.5 只在当前窗口生效3.6 卸载1 默认环境无法卸载 4 jdk安装的位置5 与IDEA集成参考 1 简介…

简单修改,让UE4/5着色器编译速度变快

简单修改&#xff0c;让UE4/5着色器编译速度变快 目录 简单修改&#xff0c;让UE4/5着色器编译速度变快 一、问题描述 二、解决方法 &#xff08;一&#xff09;硬件升级 &#xff08;二&#xff09;调整相关设置和提升优先级 1.调整相关设置 &#xff08;1&#xff09…

Pytorch 6

罗切斯特回归模型 加了激活函数 加了激活函数之后类 class LogisticRegressionModel(torch.nn.Module):def __init__(self):super(LogisticRegressionModel, self).__init__()self.linear torch.nn.Linear(1,1)def forward(self, x):# y_pred F.sigmoid(self.linear(x))y_p…

Java学习 - Spring Boot整合 Thymeleaf 实例

什么是 Thymeleaf Thymeleaf 是新一代的 Java 模板引擎&#xff0c;类似于 Velocity、FreeMarker 等传统引擎&#xff0c;其语言和 HTML 很接近&#xff0c;而且扩展性更高&#xff1b; Thymeleaf 的主要目的是将优雅的模板引入开发工作流程中&#xff0c;并将 HTML 在浏览器中…

MSPM0G3507学习笔记1:开发环境_引脚认识与点灯

今日速通一款Ti的单片机用于电赛&#xff1a;MSPM0G3507 这里默认已经安装好了Keil5_MDK 首先声明一下: 因为是速成&#xff0c;所以需要一定单片机学习基础&#xff0c;然后我写的也不会详细&#xff0c;这个专栏的笔记也就是自己能看懂就行的目标~~~ 文章提供测试代码解…

智能制造·数字化工厂建设规划方案(65P)

获取完整PPT见下图 更多有关华为研发管理/IPD、MBSE、PLM、ERP、MES、数据治理、数字样机等方面免费解决方案、资料获取&#xff0c;请见下图

Ecovadis评估的流程是什么

Ecovadis评估流程是一个全面、系统且注重细节的过程&#xff0c;旨在为企业提供关于其可持续性表现的深入洞察。这一评估不仅覆盖了企业在环境、社会和治理方面的多个方面&#xff0c;还强调了持续改进的重要性&#xff0c;确保企业能够不断提升其CSR&#xff08;企业社会责任&…

ES中聚合查询之date_histogram查询出现key_as_string 和 key含义

ES中聚合查询之date_histogram查询出现key_as_string 和 key含义 DSL语句 #实例 GET /capture_features_202407/_search {"query": {"bool": {"must": [{"terms": {"plateNo": ["汉A00001"]}},{"range&quo…

构建一个具有深色模式的简单React Web应用

在当今的Web开发世界里,创建一个既美观又功能丰富的用户界面是至关重要的。在本文中,我们将探讨如何使用React构建一个简单但功能强大的Web应用,它包含导航栏、内容展示区域和深色模式切换功能。 项目概述 我们的目标是创建一个具有以下特性的Web应用: 左侧导航栏,包含四个链…

Qt创建自定义组件并且promote to之后导致编译错误(CMake)

创建自定组件并且加入到全局(勾选"Global include"选项)后&#xff0c;重新编译&#xff0c;元对象编译器生成的ui_xxxx.h文件中会新加入自定义组件的头文件&#xff1a; 如图所示&#xff0c;编译器提示找不到自定义组件的头文件&#xff1a; Solution: 在CMakeL…

opencascade AIS_InteractiveContext源码学习9 obsolete methods

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是&#xff0c;对于已经被交互上下文识别的交互对象&#xff0c;必须使用上下文方法进行…