刷题DAY18

news2024/9/21 0:46:57

题目一

LRU算法的实现

做一个key-value结构 假如说这个LRU的大小为3 那么就是当KEY-value没满的时候 直接顺序加入 当满了的时候 把最长时间没有使用的key-value替换掉

要求实现一个put 和 get行为 时间复杂度均为O(1)

用双向链表+哈希表实现 哈希表可以用系统封装的双向链表要自己写 顺便练习一下泛型

双链表的优势是什么? 头部和尾部操作的时间复杂度为O(1) 但是查找很慢

所以我们结合hashmap 让他的查找的复杂度也变成O(1)

先看双链表

我们插入和弹出可以直接 用双链表实现  头部的是最可能被弹出的 尾部是最最近被使用的 还需要实现一个功能 把某一个节点放到尾部 代表这个点刚刚被使用过了 但是查找这个点是哪个点这个行为要交给哈希表

class Node<K,V>{
	K key;
	V value;
	Node<K,V> last;
	Node<K,V> next;
	public Node(K k,V v) {
		key = k;
		value = v;
	}
}

class NodeDoubleLinkedList<K , V>{//头部的是最可能被弹出的 尾部是最最近被使用的
	Node<K,V> headNode;
	Node<K,V> tailNode;
	
	public NodeDoubleLinkedList() {
		headNode = null;
		tailNode = null;
	}
	
	public void addNode(Node<K,V> node) {
		if (node == null) {
			return;
		}
		// newNode != null
		if (headNode == null) { // 双向链表中一个节点也没有
			headNode = node;
			tailNode = node;
		} else { // 双向链表中之前有节点,tail(非null)
			tailNode.last = node;
			node.last = tailNode;
			tailNode = node;//要连两条线呢
		}		
	}
	
	public Node<K,V> remove() {//后面需要用到这个弹出的值

		if (headNode == null) {
			return null;
		}
		Node<K, V> res = headNode;
		if (headNode == tailNode) { // 链表中只有一个节点的时候
			headNode = null;
			tailNode = null;
		} else {
			headNode = res.next;
			res.next = null;
			headNode.last = null;
		}
		return res;
	}
	
	public void movetotail(Node<K,V> cur) {
		if(cur==tailNode) {
			return;
		}
		if (headNode == cur) { // 当前node是老头部
			headNode = cur.next;
			headNode.last = null;
		} else { // 当前node是中间的一个节点
			cur.last.next = cur.next;
			cur.next.last = cur.last;
		}
		cur.last = tailNode;
		cur.next = null;
		tailNode.next = cur;
		tailNode = cur;//后面的这部分调整是一致的 就是已经把指向这个点的部分都解决了 只剩这个点本身向外指的部分了 剩下的工序就像是已经把这个点剥离下来了 把这个点安置好
	}
	class MyCache<K, V> {
		private HashMap<K, Node<K, V>> keyNodeMap;//map的key 是为了用key就能找到这个点 其实本质上这个map只需要存k和v就可以 但是为了双链表的便捷 还是封装成了node
		private NodeDoubleLinkedList<K, V> nodeList;
		private final int capacity;

		public MyCache(int cap) {
			if (cap < 1) {
				throw new RuntimeException("should be more than 0.");
			}
			keyNodeMap = new HashMap<K, Node<K, V>>();
			nodeList = new NodeDoubleLinkedList<K, V>();
			capacity = cap;
		}
		public void set(K key,V value) {
			if (keyNodeMap.containsKey(key)) {//如果包含 就把它的值给改了 然后诺到尾部 就行了
				Node<K, V> node = keyNodeMap.get(key);
				node.value = value;//map和双链表里面封装的都是node 的好处来了 只改一个就可以
				nodeList.movetotail(node);
			}else {//就要考虑满不满的问题了
				if (keyNodeMap.size() == capacity) {
					removeMostUnusedCache();
				}
				Node<K, V> newNode = new Node<K, V>(key, value);
				keyNodeMap.put(key, newNode);
				nodeList.addNode(newNode);
			}
		}
		

		public V get(K key) {
			if (keyNodeMap.containsKey(key)) {
				Node<K, V> res = keyNodeMap.get(key);
				nodeList.movetotail(res);
				return res.value;
			}
			return null;
		}
		
		public void removeMostUnusedCache() {
			Node<K,V> node = nodeList.remove();
			keyNodeMap.remove(node.key);
		}
	   
	}

题目二

一个数组的异或和是指数组中所有的数异或在一起的结果给定一个数组arr, 求最大子数组异或和。
这题用动态规划不好解 不知道哪个位置是最大的 

用常见数组累加和也不好解 没有单调性

最暴力的解法 那就是枚举每一个子数组

有一个优化方法 就是预处理数组tmp[i]是 0-i位置上的异或和 那么任何一个区间的异或和 都可以加工出来

 

然后再把所有的可能都加入前缀树 再贪心算法 对于每一条路径都要求尽可能大的话 就要前面的位置为1最好 对于符号位来说符号位0比较大(正数) 但是后面的部分是一样的 你看当负数的时候 负数的实际值应该是二进制取反+1 所以0越多 取反后的1越多 它的绝对值就越大 它的值就越小 所以我们希望还是1越多 它的值越大

如果直接把所有的可能都加入前缀树找最大值 那我为什么不把所有值都直接max抓一遍

它只把每一个预处理数组的值加入了 前缀树 然后 再在每一个预处理数组代表的区间求一个最大值不要忘记全0的时候(一个都不异或)

以0位置结尾的 以1位置结尾的 balabala

我先在前缀树中放了一个tmp[0]的 那确实只有一个值 我再加一个tmp[1] 那我可选择的路径那就是 

我异或tmp[0] 看看单独1位置的值会不会比它大 然后把tmp[1]加入路径 错误的 在这之前我们要把全0放进去 逻辑就对了

先把全0放进去 然后tmp[0]放进去 也就是比较了一个不要 和要(0)的情况 再把tmp[1]放进去 就比较了 要(1)的情况 要(0,1)的情况(这是0^arr[0]^arr[1]) 再把tmp[2]放进去 这就对比了(0,1,2)  (0) (0,1)....

那我有多种选择的时候 会不会为了最优解 这边走一个那边走一个 会不会走了两个数的二进制位

不会 因为有cur 即使会走上一条复用的路 这条路本身也只是一个数的二进制路径 而且这个best最后被修正成了实际走的路径

直接展示连招

class Node{
	Node [] nexts = new Node[2];
}
class mypretree{
	Node head = new Node();//之前没初始化 mad
	public void add(int n) {
		Node cur = head;
		for(int move = 31;move>=0;move--) {
			int v = (n>>move)&1;
			if(cur.nexts[v] == null) {
				cur.nexts[v] = new Node();
			}
			cur = cur.nexts[v];
		}
	}
	public int getmax(int num) {
		Node cur = head;
		int res = 0;
		for(int move = 31;move>=0;move--) {
			int v = (num>>move)&1;
			int best = move==31?v:v^1;//最好的情况 v为本身的时候就是 0 v ^v = 0 v^1 ^v = 1
			best = cur.nexts[best]!=null?best:best^1;//不用担心走到空上面 我们分析一下 当best存在时 直接走best best不存在时 那就是存在不best的路 反正肯定至少会有一条路让你走的
			res |= ((v^best)<<move);//v异或best 才是结果
			cur = cur.nexts[best];
		}
		return res;
	}
}
public class func {
	

	
	
	public static int MAXEOR(int [] arr) {
		if (arr == null || arr.length == 0) {
			return 0;
		}
		int eor = 0;
		int max = Integer.MIN_VALUE;
		mypretree tree = new mypretree();
		tree.add(0);
		for(int i = 0;i<arr.length;i++) {
			eor = eor^arr[i];
			max = Math.max(max, tree.getmax(eor));
			tree.add(eor);//这个顺序蛮诡异哈 先计算最大值 再加入eor 仔细想想其实是这么回事 直接getmax已经算了以i位置结尾的所有可能性了 add是为了下一步准备的
		}
		
		return max;
		
	}

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

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

相关文章

node笔记——调用免费qq的smtp发送html格式邮箱

文章目录 ⭐前言⭐smtp授权码获取⭐nodemailer⭐postman验证接口⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于node调用免费qq的smtp发送邮箱。 node系列往期文章 node_windows环境变量配置 node_npm发布包 linux_配置node node_nvm安装配置 node笔记_h…

嵌入式开发的学习与未来展望:借助STM32 HAL库开创创新之路

引言&#xff1a; 嵌入式开发作为计算机科学领域的重要分支&#xff0c;为我们的日常生活和产业发展提供了无限的可能。STMicroelectronics的STM32系列芯片以其出色的性能和广泛的应用领域而备受关注。而STM32 HAL库作为嵌入式开发的高级库&#xff0c;为学习者提供了更高效、更…

Jmeter(六) - 从入门到精通 - 建立数据库测试计划(详解教程)

1.简介 在实际工作中&#xff0c;我们经常会听到数据库的性能和稳定性等等&#xff0c;这些有时候也需要测试工程师去评估和测试&#xff0c;因此这篇文章主要介绍了jmeter连接和创建数据库测试计划的过程,在文中通过示例和代码非常详细地介绍给大家&#xff0c;希望对各位小伙…

浅谈JVM中的即时编译器(Just-In-Time compiler, JIT)

Java虚拟机&#xff08;JVM&#xff09;中的即时编译器&#xff08;Just-In-Time compiler, JIT&#xff09;是一个非常重要的组件&#xff0c;它负责将字节码转换为本地机器代码。在不使用JIT的情况下&#xff0c;JVM通过解释字节码来执行程序&#xff0c;这意味着它会为每个字…

24届近5年上海理工大学自动化考研院校分析

今天学姐给大家带来的是上海理工大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、上海理工大学 学校简介 上海理工大学&#xff08;University of Shanghai for Science and Technology&#xff09;是一所以工学为主&#xff0c;工学、理学、经济学、管理学、文…

如何实现Excel中多级数据联动

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 在类Excel表格应用中&#xff0c;常用的需求场景是根据单元格之间的数据联动&…

Leetcode-每日一题【剑指 Offer 13. 机器人的运动范围】

题目 地上有一个m行n列的方格&#xff0c;从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动&#xff0c;它每次可以向左、右、上、下移动一格&#xff08;不能移动到方格外&#xff09;&#xff0c;也不能进入行坐标和列坐标的数位之和大于k的格子。例…

css3背景渐变

1.线性渐变 <style>.box {width: 200px;height: 200px;border: 1px solid black;float: left;margin-left: 50px;}.box1 {background-image: linear-gradient(green, yellow, red);}/* 右上 */.box2 {background-image: linear-gradient(to right top, green, yellow, re…

Fortinet安全专家问答实录|如何防护暴力破解、撞库攻击

黑客攻防&#xff0c;一个看似神秘&#xff0c;但却必不可缺的领域。近期&#xff0c;全球网络与安全融合领域领导者Fortinet&#xff08;Nasdaq&#xff1a;FTNT&#xff09;&#xff0c;开启了Fortinet DEMO DAY系列实战攻防演练线上直播&#xff0c;让人人都能零距离观摩黑客…

spring cloud智慧工地源码(项目端+监管端+数据大屏+APP)

spring cloud智慧工地源码&#xff08;项目端监管端数据大屏APP&#xff09; 系统功能介绍 【智慧工地PC项目端功能总览】 一.项目人员管理 包括&#xff1a;信息管理、信息采集、证件管理、考勤管理、考勤明细、工资管理、现场统计、WIFI教育、工种管理、分包商管理、班组管…

5W2H分析法模版

&#xff08;1&#xff09;WHAT——是什么&#xff0c;目的是什么&#xff0c;做什么工作。 条件是什么&#xff0c;哪一部分工作要做&#xff0c;目的是什么&#xff0c;重点是什么&#xff0c;与什么有关系&#xff0c;功能是什么&#xff0c;规范是什么&#xff0c;工作对象…

【LeetCode】打家劫舍||

打家劫舍|| 题目描述算法分析编程代码 链接: 打家劫舍|| 在做这个题之前&#xff0c;建议大家做一下这个链接: 按摩师 我的博客里也有这个题的讲解&#xff0c;名字是按摩师 题目描述 算法分析 编程代码 class Solution { public:int maxrob(vector<int>nums,int left,…

View绘制流程-Window创建

前言&#xff1a; View绘制流程中&#xff0c;主要流程是这样的&#xff1a; 1.用户进入页面&#xff0c;首先创建和绑定Window&#xff1b; 2.首次创建以及后续vsync信号来临时&#xff0c;会请求执行刷新流程&#xff1b; 3.刷新流程完成后&#xff0c;会通知SurfaceFlin…

React源码解析18(1)------ React.createElement 和 jsx

1.React.createElement 我们知道在React17版本之前&#xff0c;我们在项目中是一定需要引入react的。 import React from “react” 即便我们有时候没有使用到React&#xff0c;也需要引入。原因是什么呢&#xff1f; 在React项目中&#xff0c;如果我们使用了模板语法JSX&am…

计算机网络实验1:网络命令学习

文章目录 1. 主要教学内容2. ping命令2.1 发送ping测试报文2.2 检测TCP/IP 3. tracert命令4. ipconfig命令5. netstat命令6. arp命令7. net命令8. netsh命令 1. 主要教学内容 实验内容&#xff1a;学习ping、tracert、ipconfig等常用的网络命令。所需学时&#xff1a;1。重难点…

数据结构-栈(C语言简单实现)

简介 栈是一种数据结构栈可以用来存放数字一次只能向栈里加入一个数字&#xff0c;一次也只能从栈里获得一个数字栈里到的数字有前后顺序&#xff0c;先进入到的数字在前&#xff0c;后进入的数字在后每次从栈里获取的数字一定是最后面的数字&#xff0c;最后获取的数字一定是…

使用svg生成图像

使用svg生成图像 每个HTML开发人员都应该对可伸缩的向量图形有一个基本的理解。本文会通过使用svg创建一个雨伞图像来介绍一下svg的基本知识。 svg介绍 SVG 意为可缩放矢量图形&#xff08;Scalable Vector Graphics&#xff09;。是一种可以在HTML中创建图像的方式。 我们…

Java # Spring(2)

一、Spring事物 一、分类 编程式事物&#xff1a;代码中硬编码&#xff08;不推荐使用&#xff09; 声明式事物&#xff1a;配置文件中配置&#xff08;推荐使用&#xff09; 分类&#xff1a; 基于xml的声明式事物基于注解的声明式事物 二、隔离级别 ISOLATION_DEFAULT&…

navicat连接postgresql报错

navicat连接postgresql报错 navicat连接postgresql报错 现象 有小伙伴告诉我 安装了新的postgresql 使用navicat连接&#xff0c;报错 ERROR: column "datlastsysoid" does not existLINE 1: SELECT DISTINCT datlastsysoid FROM pg database column “datlastsy…

电源控制--条件稳定

控制系统的条件稳定是指系统在一定条件下能够保持稳定性的特性。稳定性是控制系统设计中非常重要的概念&#xff0c;它涉及系统的输出在时间上是否趋向于有限值或者周期性变化&#xff0c;而不是无限增长或发散。 在控制系统中&#xff0c;条件稳定的要求通常涉及到以下几个方…