秋招突击——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.rhkb.cn/news/384623.html

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

相关文章

【C++】模板详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

域内攻击手法——AS-REP Roasting攻击和Kerberoasting攻击

一、AS-REP Roasting攻击 1、AS-REP Roasting攻击原理 AS-REP Roasting是一种对用户账户进行离线爆破的攻击方式。但是该攻击方式使用上比较受限&#xff0c;因为其需要用户账户设置不要求Kerberos 预身份验证选项&#xff0c;而该选项默认是没有勾选的。Kerberos 预身份验证…

基于jeecgboot-vue3的Flowable流程仿钉钉流程设计器-发送信息服务处理

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、因为仿钉钉设计器里发送消息处理是一个服务任务&#xff0c;所以要根据这个服务任务进行处理 2、这里目前只对消息进行处理&#xff0c;就是用websocket的发送方式 输入相应的内容&…

最新爆火的开源AI项目 | LivePortrait 本地安装教程

LivePortrait 本地部署教程&#xff0c;强大且开源的可控人像AI视频生成 1&#xff0c;准备工作&#xff0c;本地下载代码并准备环境&#xff0c;运行命令前需安装git 以下操作不要安装在C盘和容量较小的硬盘&#xff0c;可以找个大点的硬盘装哟 2&#xff0c;需要安装FFmp…

Java-- Stream流

感受stream流 代码 package demo1;import javax.naming.Name; import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class StreamDemo1 {public static void main(String[] args) {ArrayList<String> list1 new ArrayList<>();l…

基于深度学习算法,支持再学习功能,不断提升系统精准度的智慧地产开源了。

智慧地产视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。通过计算机视觉和…

Java | Leetcode Java题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; class Solution {public int numSquares(int n) {if (isPerfectSquare(n)) {return 1;}if (checkAnswer4(n)) {return 4;}for (int i 1; i * i < n; i) {int j n - i * i;if (isPerfectSquare(j)) {return 2;}}return 3;}// 判断是否为…

Spring Security学习笔记(二)Spring Security认证和鉴权

前言&#xff1a;本系列博客基于Spring Boot 2.6.x依赖的Spring Security5.6.x版本 上一篇博客介绍了Spring Security的整体架构&#xff0c;本篇博客要讲的是Spring Security的认证和鉴权两个重要的机制。 UsernamePasswordAuthenticationFilter和BasicAuthenticationFilter是…

Idea 编译项目报错 java: java.lang.OutOfMemoryError:GC overhead limit exceeded

报错 java: java.lang.OutOfMemoryError: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObjectpos13979: GC overhead limit exceeded解决 默认是700M&#xff0c;有的时候项目引入的依赖包比较大&#xff0c;可能超过了700M,需要扩大&#xff0c;根据实际情况设…

Dockerfile指令详解和Docker操作命令

1.容器的特点&#xff1a;1&#xff09;自包含&#xff08;包括应用程序及其运行环境&#xff09;&#xff1b;2&#xff09;可移植&#xff1b;3&#xff09;相互隔离&#xff1b;4&#xff09;轻量级。 2.docker成为容器的事实标准在于&#xff1a;1&#xff09;在运行环境上…

开局一个启动器:从零开始入坑ComfyUI

前几天刷某乎的时候看到了一位大佬写的好文&#xff0c;可图 IP-Adapter 模型已开源&#xff0c;更多玩法&#xff0c;更强生态&#xff01; - 知乎 (zhihu.com) 久闻ComfyUI大名&#xff0c;决定试一下。这次打算不走寻常路&#xff0c;不下载现成的一键包了&#xff0c;而是…

ESP32和mDNS学习

目录 mDNS的作用mDNS涉及到的标准文件组播地址IPv4 多播地址IPv6 多播地址预先定义好的组播地址 mDNS调试工具例程mDNS如何开发和使用注册服务查询服务 mDNS的作用 mDNS 是一种组播 UDP 服务&#xff0c;用来提供本地网络服务和主机发现。 你要和设备通信&#xff0c;需要记住…

【计算机网络】静态路由实验

一&#xff1a;实验目的 1&#xff1a;掌握通过静态路由方法实现网络的连通性。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS-C服务器、网线、Windows 2019/2003操作系统的计算机等。 软件&#xff1a;记事本、WireShark、Chrome浏览器等。 三&#xff1a;实验方…

Spark实时(二):StructuredStreaming编程模型

文章目录 StructuredStreaming编程模型 一、基础语义 二、事件时间和延迟数据 三、​​​​​​​容错语义 StructuredStreaming编程模型 一、基础语义 Structured Streaming处理实时数据思想是将实时数据看成一张没有边界的表,数据源源不断的追加到这张表中,这可以让我…

实时捕获数据库变更

1.CDC概述 CDC 的全称是 Change Data Capture &#xff0c;在广义的概念上&#xff0c;只要能捕获数据变更的技术&#xff0c;我们都可以称为 CDC 。我们目前通常描述的CDC 技术主要面向数据库的变更&#xff0c;是一种用于捕获数据库中数据变更的技术&#xff0c;CDC 技术应用…

web网站组成

web网站由四部分组成&#xff1a;浏览器 前端服务器 后端服务器 数据库服务器 流程&#xff1a; 1.浏览器输入网站后&#xff0c;向前端服务器发送请求&#xff0c;前端服务器响应&#xff0c;静态的数据给浏览器。 2.前端代码中script中有url,这个是向后台发送请求的网…

Windows下帆软BI(finebi)单机部署移植(Tomcat)攻略

一、基础环境 操作系统&#xff1a;Windows 10 64bit 帆软BI 版本&#xff1a;V9.0/V10.0 HTTP工具&#xff1a;Tomcat 外置数据库&#xff1a;Oracle 11g 实验内容&#xff1a;将已经部署好的帆软BI从一台电脑移植到另一台电脑 二、前期准备 1、做好外置数据库移植&…

结合创新!小波变换+注意力机制,实现100%分类准确率

小波变换是一种新的变换分析方法&#xff0c;它能有效提取信号的局部特征&#xff0c;但无法完全捕捉数据重要部分。为了解决这个问题&#xff0c;我们引入注意力机制&#xff0c;利用其强化关注重点的优势&#xff0c;将两者结合&#xff0c;做到更全面、深入地挖掘数据特征&a…

【初阶数据结构】9.二叉树(4)

文章目录 5.二叉树算法题5.1 单值二叉树5.2 相同的树5.3 另一棵树的子树5.4 二叉树遍历5.5 二叉树的构建及遍历 6.二叉树选择题 5.二叉树算法题 5.1 单值二叉树 点击链接做题 代码&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* …

昇思25天学习打卡营第22天|CycleGAN图像风格迁移互换

相关知识 CycleGAN 循环生成网络&#xff0c;实现了在没有配对示例的情况下将图像从源域X转换到目标域Y的方法&#xff0c;应用于域迁移&#xff0c;也就是图像风格迁移。上章介绍了可以完成图像翻译任务的Pix2Pix&#xff0c;但是Pix2Pix的数据必须是成对的。CycleGAN中只需…