牛客网【面试必刷TOP101】~ 11 模拟

牛客网【面试必刷TOP101】~ 11 模拟

文章目录

    • 牛客网【面试必刷TOP101】~ 11 模拟
    • @[toc]
      • BM97 旋转数组(★★)
      • BM98 螺旋矩阵(★)
      • BM99 顺时针旋转矩阵(★★)
      • BM100 设计LRU缓存结构(★★★)
      • BM101 设计LFU缓存结构(★★★)

BM97 旋转数组(★★)

两次反转

[1, 2, 3, 4, 5, 6]
[4, 3, 2, 1, 6, 5]
[5, 6, 1, 2, 3, 4]

public class Solution {public int[] solve (int n, int m, int[] a) {m %= n;reverse(a, 0, n - m - 1);reverse(a, n - m, n - 1);reverse(a, 0, n - 1);return a;}private void reverse(int[] a, int i, int j) {while (i < j) {int t = a[i];a[i++] = a[j];a[j--] = t;}}
}

BM98 螺旋矩阵(★)

一U型遍历

public class Solution {public ArrayList<Integer> spiralOrder (int[][] matrix) {ArrayList<Integer> res = new ArrayList<>();if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {return res;}int top = 0, bottom = matrix.length - 1;int left = 0, right = matrix[0].length - 1;while (left <= right && top <=bottom) {for (int i = left; i <= right; i++) res.add(matrix[top][i]);for (int i = top + 1; i <= bottom; i++) res.add(matrix[i][right]);if (left < right && top < bottom) {for (int i = right - 1; i > left; i--) res.add(matrix[bottom][i]);for (int i = bottom; i > top; i--) res.add(matrix[i][left]);}top++;right--;bottom--;left++;}return res;}
}

BM99 顺时针旋转矩阵(★★)

[1, 2, 3] [1, 4, 7] [7, 4, 1]
[4, 5, 6] 沿对角线旋转 [2, 5, 8] 竖轴对称旋转 [8, 5, 2]
[7, 8, 9] [3, 6, 9] [9, 6, 3]

public class Solution {public int[][] rotateMatrix (int[][] mat, int n) {// 沿左上对角线旋转for (int i = 0; i < n; i++) {for (int j = 0; j < i; j++) {if (i == j) continue;int t = mat[i][j];mat[i][j] = mat[j][i];mat[j][i] = t;}}// 竖轴对称旋转for (int i = 0; i < n; i++) {for (int j = 0; j < n / 2; j++) {int t = mat[i][j];mat[i][j] = mat[i][n - j - 1];mat[i][n - j - 1] = t;}}return mat;}
}

BM100 设计LRU缓存结构(★★★)

🌟🌟🌟🌟🌟🌟

哈希表+双向链表

public class Solution {class DLinkedNode {int key;int value;DLinkedNode prev;DLinkedNode next;DLinkedNode () {};DLinkedNode (int key, int value) {this.key = key;this.value = value;}}private int size;private int capacity;private DLinkedNode head, tail;private HashMap<Integer, DLinkedNode> cache = new HashMap<Integer, DLinkedNode>();public Solution(int capacity) {size = 0;this.capacity = capacity;// 使用伪头部和伪尾部节点this.head = new DLinkedNode();this.tail = new DLinkedNode();head.next = tail;tail.prev = head;}public int get(int key) {DLinkedNode node = cache.get(key);if (node == null) return -1;moveToHead(node);return node.value;}public void set(int key, int value) {DLinkedNode node = cache.get(key);if (node == null) {DLinkedNode newNode = new DLinkedNode(key, value);cache.put(key, newNode);addToHead(newNode);size++;if (size > capacity) {DLinkedNode tail = removeTail();cache.remove(tail.key);size--;}} else {node.value = value;moveToHead(node);}return;}private void addToHead(DLinkedNode node) {node.prev = head;node.next = head.next;head.next.prev = node;head.next = node;}private void removeNode(DLinkedNode node) {node.prev.next = node.next;node.next.prev = node.prev;}private void moveToHead(DLinkedNode node) {removeNode(node);addToHead(node);}private DLinkedNode removeTail() {DLinkedNode res = tail.prev;removeNode(res);return res;}}

BM101 设计LFU缓存结构(★★★)

🌟🌟🌟🌟🌟🌟

方法一:HashMap+TreeMap(684ms)

import java.util.*;public class Solution {// 缓存容量、时间戳int capacity, time;Map<Integer, Node> key_table;TreeSet<Node> tree;List<Integer> res;public int[] LFU (int[][] operators, int k) {this.capacity = k;this.time = 0;this.key_table = new HashMap<Integer, Node>();this.tree = new TreeSet<Node>();this.res = new ArrayList<Integer>();for (int[] opt : operators) {if (opt[0] == 1) {set(opt[1], opt[2]);} else {res.add(get(opt[1]));}} int[] answer = new int[res.size()];for (int i = 0; i < res.size(); i++) {answer[i] = res.get(i);}return answer;}public int get(int key) {if (capacity == 0) return -1;if (!key_table.containsKey(key)) return -1;Node node = key_table.get(key);key_table.remove(key);tree.remove(node);node.cnt += 1;node.time = ++time;tree.add(node);key_table.put(key, node);return node.value;}public void set(int key, int value) {if (capacity == 0) return;if (key_table.containsKey(key)) {Node node = key_table.get(key);tree.remove(node);key_table.remove(key);node.value = value;node.cnt += 1;node.time = ++time;tree.add(node);key_table.put(key, node);} else {if (tree.size() == capacity) {key_table.remove(tree.first().key);tree.remove(tree.first());}Node newNode = new Node(key, value, 1, ++time);tree.add(newNode);key_table.put(key, newNode);}}class Node implements Comparable<Node> {int key, value;int cnt, time;Node(){};Node(int key, int value, int cnt, int time) {this.key = key;this.value = value;this.cnt = cnt;this.time = time;}public boolean equals(Object obj) {if (this == obj) return true;if (obj instanceof Node) {Node node = (Node) obj;return this.key == node.key && this.value == node.value;}return true;}public int compareTo(Node node) {// 降序排列return this.cnt == node.cnt ? this.time - node.time : this.cnt - node.cnt;}public int hashCode() {return this.cnt * 1000000007 + time;}}}

方法二:双HashMap+DoublyLinkedList(591ms)

import java.util.*;public class Solution {int capacity, minfreq;Map<Integer, Node> keyTable;Map<Integer, DLinkedList> freqTable;List<Integer> res;public int[] LFU (int[][] operators, int k) {this.capacity = k;this.minfreq = 0;this.keyTable = new HashMap<Integer, Node>();this.freqTable= new HashMap<Integer, DLinkedList>();this.res = new ArrayList<Integer>();for (int[] opt : operators) {if (opt[0] == 1) {this.set(opt[1], opt[2]);} else {res.add(this.get(opt[1]));}}int[] answer = new int[res.size()];for (int i = 0; i < res.size(); i++) {answer[i] = res.get(i);}return answer;}public int get(int key) {if (capacity == 0) return -1;if (!keyTable.containsKey(key)) return -1;Node node = keyTable.get(key);int val = node.val, freq = node.freq;freqTable.get(freq).remove(node);if (freqTable.get(freq).size == 0) {freqTable.remove(freq);if (minfreq == freq) {minfreq += 1;}}DLinkedList list = freqTable.getOrDefault(freq + 1, new DLinkedList());list.addFirst(new Node(key, val, freq + 1));freqTable.put(freq + 1, list);keyTable.put(key, list.getHead());return val;}public void set(int key, int val) {if (capacity == 0) return;if (keyTable.containsKey(key)) {Node node = keyTable.get(key);int freq = node.freq;freqTable.get(freq).remove(node);if (freqTable.get(freq).size == 0) {freqTable.remove(freq);if (minfreq == freq) {minfreq += 1;}}DLinkedList list = freqTable.getOrDefault(freq + 1, new DLinkedList());list.addFirst(new Node(key, val, freq + 1));keyTable.put(key, list.getHead());freqTable.put(freq + 1, list);} else {if (keyTable.size() == capacity) {Node node = freqTable.get(minfreq).getTail();keyTable.remove(node.key);freqTable.get(minfreq).remove(node);if (freqTable.get(minfreq).size == 0) {freqTable.remove(minfreq);}}DLinkedList list = freqTable.getOrDefault(1, new DLinkedList());list.addFirst(new Node(key, val, 1));keyTable.put(key, list.getHead());freqTable.put(1, list);minfreq = 1;}}class Node {int key, val, freq;Node prev, next;Node(){ this(-1, -1, 0); }Node(int key, int val, int freq) {this.key = key;this.val = val;this.freq = freq;}}class DLinkedList {Node dummyHead;Node dummyTail;int size;DLinkedList() {this.dummyHead = new Node();this.dummyTail = new Node();this.dummyHead.next = this.dummyTail;this.dummyTail.prev = this.dummyHead;this.size = 0;}public void addFirst(Node node) {node.next = dummyHead.next;node.prev = dummyHead;dummyHead.next.prev = node;dummyHead.next = node;size++;}public void remove(Node node) {node.prev.next = node.next;node.next.prev = node.prev;size--;}public Node getHead() {return this.dummyHead.next;}public Node getTail() {return this.dummyTail.prev;}}}

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

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

相关文章

vite初始化vue3项目(配置自动格式化工具与git提交规范工具)

初始化项目 vite构建vue项目还是比较简单的&#xff0c;简单配置选择一下就行了 初始化命令 npm init vuelatest初始化最新版本vue项目 2. 基本选项含义 Add TypeScript 是否添加TSADD JSX是否支持JSXADD Vue Router是否添加Vue Router路由管理工具ADD Pinia 是否添加pinia…

Nginx反向代理配置流式响应

Nginx 是通过缓存响应内容来处理请求的。也就是说&#xff0c;当 Nginx 接收到完整的响应后&#xff0c;才会将其发送给客户端&#xff0c;所以默认不支持流式响应&#xff0c;这里讲讲 Nginx 反向代理中怎么配置流式响应&#xff1f; 一、使用背景 最近使用 Egg.js 搭建自动化…

TypeError: Cannot read properties of undefined (reading ‘container‘)

问题环境&#xff1a; element项目 el-table的错误 项目是由 webpack项目迁移为 vite项目 问题描述&#xff1a; errorLog.js?t1692581753160:17 TypeError: Cannot read properties of undefined (reading container) at unbind (infinite-scroll.js:259:31) …

【腾讯云 TDSQL-C Serverless 产品测评】全面测评TDSQL-C Mysql Serverless

全面测评TDSQL-C Mysql Serverless 文章目录 全面测评TDSQL-C Mysql Serverless前言什么是TDSQL-C Mysql Serverless初始化 TDSQL-C Mysql Serverless新建数据库建立数据表开启外网访问 兼容性SQL文件 导入导出navicat 直接在线传输 构建测试环境准备Python测试脚本准备 Jmeter…

php的openssl_encrypt是不是自动做了PKCS5Padding?

在PHP中&#xff0c;openssl_encrypt函数默认使用的是PKCS7填充&#xff08;不是PKCS5填充&#xff09;。PKCS7填充实际上是PKCS5填充的扩展&#xff0c;用于对不同块大小的数据进行填充。 当你使用openssl_encrypt函数进行加密时&#xff0c;如果你没有显式指定填充模式和填充…

Unity框架学习--对象池

频繁创建和销毁对象会造成性能的开销。 创建对象的时候&#xff0c;系统会为这个对象开辟一片新的空间。销毁对象的时候&#xff0c;这个对象会变成内存垃圾&#xff0c;当内存垃圾达到一定程度&#xff0c;就会触发垃圾回收机制&#xff0c;清理内存垃圾&#xff0c;由…

下载安装并使用小乌龟TortoiseGit

1、下载TortoiseGit安装包 官网&#xff1a;Download – TortoiseGit – Windows Shell Interface to Githttps://tortoisegit.org/download/ 2、小乌龟汉化包 在官网的下面就有官方提供的下载包 3、安装

Electron入门,项目运行,只需四步轻松搞定。

electron 简单介绍&#xff1a; 实现&#xff1a;HTML/CSS/JS桌面程序&#xff0c;搭建跨平台桌面应用。 electron 官方文档&#xff1a; [https://electronjs.org/docs] 本文是基于以下2篇文章且自行实践过的&#xff0c;可行性真实有效。 文章1&#xff1a; https://www.cnbl…

Django学习笔记(2)

创建app 属于自动执行了python manage.py 直接在里面运行startapp app01就可以创建app01的项目了 之后在setting.py中注册app01 INSTALLED_APPS ["django.contrib.admin","django.contrib.auth","django.contrib.contenttypes","django.c…

合并jar包导致gradle传递依赖失效

目录 零、背景一、合并jar包1.1、自定义一组jar包1.2、自定义合并jar的任务1.3、定义打包jar的任务 二、发布jar包2.1、未合并jar包之前的合并方式2.2、合并jar包之后的合并方式 三、发现问题3.1、确定gradle中的依赖关系3.2、对比maven是否缺失依赖3.3、对比合并前后的pom.xml…

Source Insight配置Cppcheck做静态测试(Windows)

1.安装cppcheck 先从cppcheck官方网站下载cppcheck的安装包。 注&#xff1a; &#xff08;1&#xff09;官网地址&#xff1a;https://sourceforge.net/projects/cppcheck &#xff08;2&#xff09;截止2023年8月&#xff0c;官方发布的最新版本是cppcheck-2.11-x64-Setup.…

子集-回溯方法

class Solution {//题解思路//LinkedList<Integer> path new LinkedList<>(); List<List<Integer>> results new ArrayList<>();public List<List<Integer>> subsets(int[] nums) {//主方法中调用方法同时传入指定的参数初始值bac…

【数据挖掘】使用 Python 分析公共数据【01/10】

一、说明 本文讨论了如何使用 Python 使用 Pandas 库分析官方 COVID-19 病例数据。您将看到如何从实际数据集中收集见解&#xff0c;发现乍一看可能不那么明显的信息。特别是&#xff0c;本文中提供的示例说明了如何获取有关疾病在不同国家/地区传播速度的信息。 二、准备您的…

【计算机视觉|生成对抗】改进的生成对抗网络(GANs)训练技术

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Improved Techniques for Training GANs 链接&#xff1a;[1606.03498v1] Improved Techniques for Training GANs (arxiv.org) 摘要 本文介绍了一系列应用于生成对抗网络&#xff08;G…

ICCV23 | Ada3D:利用动态推理挖掘3D感知任务中数据冗余性

​ 论文地址&#xff1a;https://arxiv.org/abs/2307.08209 项目主页&#xff1a;https://a-suozhang.xyz/ada3d.github.io/ 01. 背景与动因 3D检测(3D Detection)任务是自动驾驶任务中的重要任务。由于自动驾驶任务的安全性至关重要(safety-critic)&#xff0c;对感知算法的延…

HCIP STP总结

网桥的4个选举 根网桥&#xff1a; 有且仅有一台&#xff0c;且由BPDU中的桥ID来决定 桥ID 网桥优先级&#xff08;0-65535公有&#xff09; 默认32768 MAC地址&#xff08;只有存在svi接口…

Pinia基础教程

Pinia wiki Pinia 起始于 2019 年 11 月左右的一次实验&#xff0c;其目的是设计一个拥有组合式 API 的 Vue 状态管理库。从那时起&#xff0c;我们就倾向于同时支持 Vue 2 和 Vue 3&#xff0c;并且不强制要求开发者使用组合式 API&#xff0c;我们的初心至今没有改变。除了安…

数据结构-->栈

&#x1f495;休对故人思故国&#xff0c;且将新火试新茶&#xff0c;诗酒趁年华&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;详解链表OJ题 前言&#xff1a; 前面已经学习过顺序表&#xff0c;链表。他们都是线性表&#xff0c;今天要学习的栈也是一种线…

【C++】C 语言 和 C++ 语言中 const 关键字分析 ② ( const 常量分配内存时机 | const 常量在编译阶段分配内存 )

文章目录 一、const 常量内存分配时机二、使用如下代码验证 const 常量内存分配时机三、分析验证结果 - const 常量在编译阶段分配内存 一、const 常量内存分配时机 在上一篇博客中 , 讲到了获取 const 常量的地址 , 代码如下 : // 定义常量// 该常量定义在了 符号表 中// 符号…

C++--深度理解智能指针

PS:智能指针简单应用看这里 http://t.csdn.cn/qN7IK 1.智能指针的介绍 在C中&#xff0c;智能指针有三个版本&#xff0c;分别为&#xff1a; auto_ptr unique_ptr shared_ptr 这三个版本的智能指针中&#xff0c;shared_ptr最为完善&#xff0c;auto_ptr基本上没有太大用…