秋招突击——7/9——复习{Java实现——LRU,Java实现——搜索插入位置}——新作{二分查找——搜索二维矩阵}

文章目录

    • 引言
    • 复习
      • Java实现——LRU缓存
        • 对照实现
      • Java实现——搜索插入位置
        • java实现
        • 知识补充
    • 新作
      • 搜索二维矩阵
        • 个人实现
        • 参考实现
    • 总结

引言

  • 以后都要向使用Java刷算法进行过滤了,所以今天主要是复习为主,复习两道之前做过的题目,然后做两道新的题目。
  • 今天继续加油吧!

复习

Java实现——LRU缓存

  • 第一次学习链接
  • 第二次学习链接
  • 题目链接
对照实现
  • 如果要使用Java实现,得学这些一下,对照着实现!Java的语法是知道的,但是忽然间写这个,还是有点不习惯的!

知识补充
Map接口具有哪些具体的实现对象?有什么区别?

  • HashMap

    • 基于哈希表实现,允许null的键
    • 插入时间复杂度是O(1),适用于需要快速访问元素时的操作
    • 非线程安全
  • LinkedHashMap

    • 继承HashMap,底层是用双向链表维护节点
    • 时间复杂度是O(1),适用于需要按照插入顺序或者访问顺序遍历元素使用。
  • TreeMap

    • 基于红黑树实现,按key的自然顺序或者提供的比较器进行排序,线程不安全
    • O(log N),按照键的顺序访问元素使用
  • ConcurrentHashMap

    • 线程安全,使用分段锁机制提高并发性能
    • 多线程环境下,比Hashtable好用

Java中如何表示空指针

  • null不是None
  • 有啥区别?
    *
    好吧,东西太多了,记混了,以后就用Java和python了,类的声明方法也是的,用的太多了,就混了

使用HashMap实现的相关方法

  • 如何插入对应的值?
 // 创建一个HashMap
        HashMap<Integer, String> hashMap = new HashMap<>();

        // 插入键值对
        hashMap.put(1, "Value1");
        hashMap.put(2, "Value2");
        hashMap.put(3, "Value3");
  • 如何删除对应的值?
// 删除键值对
    String removedValue = hashMap.remove(2);
  • 如何判定对应的值是否存在?
// 判定键是否存在
boolean containsKey2 = hashMap.containsKey(2);
boolean containsKey4 = hashMap.containsKey(4);

具体实现

class LRUCache {
    class Node{    
        int key,val;
        Node right,left;
        public Node(int _key,int _val){
            key = _key;
            val = _val;
            right = null;   // how to represent nulll pointer in Java
            left = null;
        }
    }
    Map<Integer,Node> dict;
    Node L,R;
    int capacity;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.L = new Node(-1,-1);
        this.R = new Node(-1,-1);
        dict = new HashMap<>();
        L.right = R;
        R.left = L;
    }
    
    public void remove(Node temp){
        // remove the temp from the list
        temp.left.right = temp.right;
        temp.right.left = temp.left;
    }

    public void insert(Node temp){
        // insert the temp to the first
        temp.right = L.right;
        temp.left = L;

        L.right.left = temp;
        L.right = temp;
    }

    public int get(int key) {
        // judge whether the key exists
        if(!dict.containsKey(key))  return -1;
        
        // refresh the key and return the value
        Node temp = dict.get(key);
        remove(temp);
        insert(temp);
        return temp.val;

     
    }
    
    public void put(int key, int value) {
        
        // judge whether the key-value exists
        if(dict.containsKey(key)){
            // update the key-value 
            Node temp = dict.get(key);
            temp.val = value;
            remove(temp);
            insert(temp);
            return ;
        }
        
        // insert the key-value into cache
        Node temp = new Node(key,value);
        dict.put(key,temp);
        insert(temp);

        // judge  whether the cache is full
        if(dict.size() > capacity){
            Node toRemove = R.left;
            // remove(R.left);
            remove(toRemove);
            // dict.remove(R.left.key);
            dict.remove(toRemove.key);
        }
    }
}

/**
 * Your LRUCache object will be instantiated and called as such:
 * LRUCache obj = new LRUCache(capacity);
 * int param_1 = obj.get(key);
 * obj.put(key,value);
 */

在这里插入图片描述
最后这里真的是蠢死了,我没有发现他居然是已经删除了节点,R.left已经发生了变化,弄了半天!

总结

  • 以后都用Java了,一方面是复习语法特性,另外一方面,Java的语法写起来,确实比C++好用太多了,还是用Java吧!

Java实现——搜索插入位置

  • 这道题做了一遍,这一次单纯是使用java重新刷一下
  • 第一次学习链接
  • 单纯就是一个二分搜索的模版题
java实现

如何对Java中的数组,获取长度

  • 使用length,不是方法

具体实现

class Solution {
    public int searchInsert(int[] nums, int target) {
        int l = 0,r = nums.length - 1,mid = 0;
        while(l <= r){
            mid = (l + r) >> 1;
            if(nums[mid] < target)  l = mid + 1;
            else if(nums[mid] > target) r = mid - 1;
            else return mid;
        }
        return l;
    }
}
知识补充

C++中vector,对应Java中的什么?

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> a = new ArrayList();
        a.add(1);
        a.add(2);
        a.add(3);
        a.add(4);
        a.add(5);

        System.out.println(a.get(3));
        System.out.println(a.size());
        for(int x : a)
            System.out.println(x);
        System.out.println("Hello world!"
        );
    }
}

其他实现
在这里插入图片描述

C++中的priority_queue对应Java中的什么?

import java.util.PriorityQueue;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {
        PriorityQueue<Integer> pq = new PriorityQueue<>(Comparator.reverseOrder());
        
        pq.add(1);
        pq.add(2);
        pq.add(3);
        
        while(!pq.isEmpty()){
            System.out.println(pq.poll());
        }
    }
}
  • 这里是判定是否为空是isEmpty,不是empty两个方法
  • poll是会返回队列头的元素,然后在弹出,和pop不一样

新作

搜索二维矩阵

题目链接
在这里插入图片描述
在这里插入图片描述
注意

  • 矩阵从左到右是严格递增的,所以不存在相等的情况
  • 每一行开头的元素都是大于上一行最后一个元素
  • 返回在列表中能否找到对应的元素
个人实现
  • 这道题就是一个两次二分查找,现在第一行进行二分查找,然后在在当前行中进行二分查找,不过我可能对Java中的二维数组操作不是很习惯!

具体实现代码如下

class Solution {
    public boolean searchMatrix(int[][] mat, int tar) {
        // find the line
        int m = mat.length,n = mat[0].length;
        int up = 0 , down = mat.length - 1,midRow = 0;
        while(up < down){
            midRow = (up + down ) >> 1;
            if(mat[midRow][0] < tar)    up = midRow + 1;
            else if(mat[midRow][0] > tar)  down = midRow - 1;
            else return true;
        }
      
        
        // judge the mid condition
        if(up - 1 >= 0 && mat[up - 1][n - 1] >= tar && mat[up -1][0] <= tar  )   up --;
        else if (up + 1 < m - 1 && mat[up + 1][n - 1] >= tar && mat[up + 1][0] <= tar )  up ++;

        
        // find the col
        int l = 0,r = mat[0].length - 1,midCol = 0;
        while(l <= r){
            midCol = (l + r) >>1 ;
            if(mat[up][midCol] > tar) r = midCol - 1;
            else if(mat[up][midCol] < tar) l = midCol + 1;
            else return true;  
        }
        if(mat[up][midCol] == tar)  return true;

        return false;
    }
}

写是写完了,但是有点小问题

  • 第一个判定索引那里,会出现异常情况,这里还是看一下其他的怎么求的吧!
  • 这里是将整个二维矩阵逐行进行拼接,将二维矩阵转成一维矩阵,然后根据一维有序数组,使用二分查找目标值。
  • 这里专门提到了二分模板,这里也贴一下,自己老是对边界值有误解
参考实现

二分查找的模板

  • 有x找到x,否则找到一个最接近x,并且比x大的数字
    • l == r的时候退出循环
    • l是最终的目标值,返回的是最接近x并且第一个比x大的数字
int l = 1,r = n;
while(l < r){
	int mid = (l + r) >>1;
	if(a[mid] >= x)	r = mid;
	else l = mid + 1;
}
  • 有x找到x,否则找到第一个最接近x,并且比x小的数字
    • 具体条件同上
int l = 1,r = n;
while(l < r){
	int mid = (l + r) >>1;
	if(a[mid] <= x)	l = mid;
	else r = mid - 1;
}
  • 这里背诵的话,基本上是通过的返回条件的要求确定,返回的第一个大于他的数字,就是符号就是大于等于,小于即使小于等于。

左加大,右减小

数组坐标转换

  • 行数 = index / 一行多少个元素
  • 列数 = index % 一行多少个元素

参考实现代码

class Solution {
    public boolean searchMatrix(int[][] mat, int tar) {
        //  jedge the edge condition
        if(mat.length == 0 || mat[0].length == 0)  return false;

        // convert the idx
        int m = mat.length,n = mat[0].length;
        int l = 0,r = m * n -1;
        while(l < r){
            int mid = (l +r) >> 1;
            if(mat[mid / n][mid % n] >= tar)   r = mid;
            else l = mid  + 1; 
        }
        
        return mat[l / n][l % n] == tar;
    }
}
  • 这个模板还是挺好记的,继续加油吧!

总结

  • 今天搞得太晚了,已经一点钟了,再不睡,明天又没有精神,不行的!今天主要是加班搞定了MySQL中的索引,明天早上在起来 背背对应的八股,应该就够了。
  • 后续再看需要什么,在补充什么,加油,尽快把简历还有项目弄完!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java Web的考编论坛网站的设计与实现+lw+源码+讲解+调试+视频演示

第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料&#xff0c;分析人员可以根据这些信息确定出本系统具备的功能&#xff0c;分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作&#xff0c;但…

Springboot项目实训--day2

今天学习的是idea和MySQL的连接&#xff0c;以及一些基本的增删改查的功能实现。 一、软件下载 昨天下载了idea&#xff0c;今天要是西安它们的连接&#xff0c;就需要再下载MySQL&#xff0c;我的MySQL是前面几个学期别人帮忙下载的&#xff0c;所以具体的操作步骤我也不清楚…

Java并发关键字

并发关键字 关键字: synchronized详解关键字: volatile详解关键字: final详解 # Synchronized可以作用在哪里? 对象锁方法锁类锁 # Synchronized本质上是通过什么保证线程安全的? 加锁和释放锁的原理 深入JVM看字节码&#xff0c;创建如下的代码&#xff1a; public cl…

基于Java的科大讯飞大模型API调用实现

写在前面&#xff1a;因为现在自己实习的公司新拓展的一个业务是结合AI的低代码平台&#xff0c;我负责后端的开发&#xff0c;之前一直都是直接使用gpt或者文心一言等ui界面来直接使用大模型&#xff0c;从来没有自己调接口过&#xff0c;所以本文记录一下自己第一次使用大模型…

vue子组件调用父组件方法

父组件 页面<popoverss ref"pop" :goodspop"goodspop"></popoverss>子组件components: {"popoverss": () > import(../comm/popover.vue)},方法goodspop(e){console.log(e"----")return 9999;},子组件 方法props:[go…

理解点对点协议:构建高效网络通信

在通信线路质量较差的年代&#xff0c;能够实现可靠传输的高级数据链路控制&#xff08;High-level Data Link Control, HDLC&#xff09;协议曾是比较流行的数据链路层协议。HDLC是一个较复杂的协议&#xff0c;实现了滑动窗口协议&#xff0c;并支持点对点和点对多点两种连接…

单对以太网:工业4.0时代的通信革命

单对以太网连接器概述 单对以太网&#xff08;Single Pair Ethernet&#xff0c;简称SPE&#xff09;是一种新兴的以太网技术&#xff0c;它通过一对双绞线实现数据传输&#xff0c;支持PoDL&#xff08;Power over Data Line&#xff09;技术&#xff0c;为终端设备提供电力供…

Python | Leetcode Python题解之第225题用队列实现栈

题目&#xff1a; 题解&#xff1a; class MyStack:def __init__(self):"""Initialize your data structure here."""self.queue collections.deque()def push(self, x: int) -> None:"""Push element x onto stack."&…

基于单片机的温湿度感应智能晾衣杆系统设计

&#xff3b;摘 要&#xff3d; 本设计拟开发一种湿度感应智能晾衣杆系统 &#xff0c; 此新型晾衣杆是以单片机为主控芯片 来控制的实时检测系统 &#xff0e; 该系统使用 DHT11 温湿度传感器来检测大气的温湿度 &#xff0c; 然后通过单 片机处理信息来控制 28BYJ &…

Python不使用元类的ORM实现

不使用元类的简单ORM实现 在 Python 中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff09;是一种将对象和数据库之间的映射关系进行转换的技术&#xff0c;使得通过面向对象的方式来操作数据库更加方便。通常&#xff0c;我们使用元类&#xff08;metaclass&a…

网络安全合规建设

网络安全合规建设 一、法律安全需求基本合规&#xff08;1&#xff09;《网络安全法》重要节点等级保护政策核心变化 二、安全需求 业务刚需&#xff08;1&#xff09;内忧&#xff08;2&#xff09;外患 三、解决方法&#xff08;1&#xff09;总安全战略目标图&#xff08;2&…

CTF-PWN-kernel-栈溢出(retuser rop pt_regs ret2dir)

文章目录 参考qwb2018 core检查逆向调试打包上传测试脚本retuserkernel ropinit_credcommit_creds( prepare_kernel_cred(0) )开启KPTI利用swapgs_restore_regs_and_return_to_usermode开启KPTI利用SIGSEGVrop设置CR3寄存器再按照没有KPTI返回 kernel rop ret2userpt_regs 构造…

谈面向任务的多轮对话系统(TOD)

面向任务对话系统&#xff08;Task-Oriented Dialogue (TOD) Systems)主要是为解决特定任务的&#xff0c;比如订票任务&#xff08;订机票&#xff0c;电影票等&#xff09;&#xff0c;预定饭店等。这种对话往往需要多轮对话才能够完成。 多轮对话的例子 客户预定一个餐厅的…

仕考网:公务员考试面试时间一般多长?

公务员考试主要分为笔试与面试两个阶段&#xff0c;其中面试是笔试通过的下一关&#xff0c;面试的具体安排通常由相关考试机构或招录单位负责发布并通知考生。 公务员面试的持续时间一般在30分钟至1小时之间&#xff0c;具体时长可能因地区和招录单位的不同而有所变化。常见的…

红日靶场----(三)漏洞利用

上期已经信息收集阶段已经完成&#xff0c;接下来是漏洞利用。 靶场思路 通过信息收集得到两个吧靶场的思路 1、http://192.168.195.33/phpmyadmin/&#xff08;数据库的管理界面&#xff09; root/root 2、http://192.168.195.33/yxcms/index.php?radmin/index/login&am…

LLM大模型从入门到精通(2)--LLM模型的评估指标

LLM大模型建立完成之后&#xff0c;需要对大模型的性能进行评估。评估指标可以根据具体任务的不同而有所差异&#xff0c;以下是一些常见的评估指标&#xff1a; 1. 准确率&#xff08;Accuracy&#xff09;&#xff1a;模型预测正确的样本数占总样本数的比例。 2. 精确率&am…

oracle索引字段存储数据过长,导致索引失效

1&#xff1a;短位数据&#xff0c;索引生效 2&#xff1a;长位索引&#xff0c;索引不生效 此问题发现于6月中旬&#xff0c;线上问题优化。引以为戒。 解决&#xff1a; 并未解决索引不生效问题&#xff0c; 但是基于优化查询&#xff0c;是的查询保持毫秒级

项目收获总结--Redis的知识收获

一、概述 最近几天公司项目开发上线完成&#xff0c;做个收获总结吧~ 今天记录Redis的收获和提升。 二、Redis异步队列 Redis做异步队列一般使用 list 结构作为队列&#xff0c;rpush 生产消息&#xff0c;lpop 消费消息。当 lpop 没有消息的时候&#xff0c;要适当sleep再…

【Linux】进程(9):进程控制2(进程等待)

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;9&#xff09;进程控制2&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 为什么要进程等待二. 如何进行进程等待1.wait函数—…

Linux udp编程

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…