面经整理1
感觉好几个都是backtracking
Letter Combinations of a Phone Number - LeetCode
典型的backtracking,注意String的处理
class Solution {String[] keyboard = new String[]{"", "", "abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};public List<String> letterCombinations(String digits) {List<String> res = new ArrayList<>();StringBuilder sb = new StringBuilder();if (digits.isEmpty()) return res;dfs(res, sb, digits, 0);return res;}private void dfs(List<String> res, StringBuilder sb, String digits, int idx) {if (idx == digits.length()) {res.add(sb.toString());return;}String str = keyboard[digits.charAt(idx) - '0'];for (int i = 0; i < str.length(); i++) {sb.append(str.charAt(i));dfs(res, sb, digits, idx + 1);sb.deleteCharAt(sb.length() - 1);}}
}
Decode Ways - LeetCode
这题被面过好几次,但拿到题还是没啥思路,最好的情况和斐波那契数列是一样的(这个也面过好几次)
1. Recursion with memoization,,看了花花的视频
time: O(n^2)->O(n)
space:O(n^2)->O(n)
class Solution {Map<String, Integer> map = new HashMap<>();public int numDecodings(String s) {if (s == null || s.length() == 0) return 0;map.put("", 1);return dfs(s);}private int dfs(String s) {if (map.containsKey(s)) return map.get(s);if (s.charAt(0) == '0') return 0;if (s.length() == 1) return 1;int ways = dfs(s.substring(1));String sub = s.substring(0, 2);int prefix = Integer.parseInt(sub);if (prefix >= 10 && prefix <= 26) {ways += dfs(s.substring(2));}map.put(s, ways);return ways;}
}
OpenAi 给了一个我能理解的dp解法
class Solution {public int numDecodings(String s) {if(s == null || s.length() == 0 || s.charAt(0) == '0') return 0;int n = s.length();int[] dp = new int[n + 1];dp[0] = 1;dp[1] = 1;for (int i = 2; i <= n; i++) {char first = s.charAt(i - 1);char second = s.charAt(i - 2);if (first != '0') {dp[i] += dp[i - 1];}int twoDigit = (second - '0') * 10 + (first - '0');if (twoDigit >= 10 && twoDigit <= 26) {dp[i] += dp[i - 2];}}return dp[n];}
}
Restore IP Addresses - LeetCode
正确的ip是被3个'.'分割成了4部分,所以当点的个数到3的时候要判断是否valid,valid的区间范围是【idx, i]
判断valid的条件就是当前数字的第一个数不能为0,在有效的区间内,当前的数字不能大于9或者小于0,数字记得进位num = num * 10 + digit. 如果num的范围是【0,255】
class Solution {public List<String> restoreIpAddresses(String s) {List<String> res = new ArrayList<>();StringBuilder sb = new StringBuilder(s);dfs(res, sb, 0, 0);return res;}private void dfs(List<String> res, StringBuilder sb, int idx, int points) {if (points == 3) {if (isValid(sb, idx, sb.length() - 1)) {res.add(sb.toString());}return; }for (int i = idx; i < sb.length(); i++) {if (isValid(sb, idx, i)) {points += 1;sb.insert(i + 1, '.');dfs(res, sb, i + 2, points);sb.deleteCharAt(i + 1);points -= 1;}}}private boolean isValid(StringBuilder s, int left, int right) {if (left > right) return false;if (s.charAt(left) == '0' && left != right) return false;int num = 0;for (int i = left; i <= right; i++) {if (s.charAt(i) >'9' || s.charAt(i) < '0') return false;int digit = s.charAt(i) - '0';num = num * 10 + digit;if (num > 255) return false;}return true;}
}
Validate IP Address - LeetCode
模拟实现题
class Solution {public String validIPAddress(String queryIP) {if (queryIP.indexOf('.') >= 0) {return isIpV4(queryIP) ? "IPv4" : "Neither";} else {return isIpV6(queryIP) ? "IPv6" : "Neither";}}public boolean isIpV4(String queryIP) {String[] split = queryIP.split("\\.", -1);if (split.length != 4) {return false;}for (String s : split) {if (s.length() > 3 || s.length() == 0) {return false;}if (s.charAt(0) == '0' && s.length() != 1) {return false;}int num = 0;for (int j = 0; j < s.length(); j++) {char c = s.charAt(j);if (!Character.isDigit(c)) return false;num = num * 10 + c - '0';}if (num > 255) return false;}return true;}private boolean isIpV6(String queryIP) {String[] split = queryIP.split(":", -1);if (split.length != 8) return false;for (String s : split) {if (s.length() > 4 || s.length() == 0) return false;for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if (!Character.isDigit(c) && !(Character.toLowerCase(c) >= 'a') || !(Character.toLowerCase(c) <= 'f')) {return false;}}}return true;}
}
其他的有几题做过,有几题没有做过
Merge Intervals - LeetCode
后面toArray的要再熟悉一下,有点忘记了
class Solution {public int[][] merge(int[][] intervals) {List<int[]> list = new ArrayList<>();Arrays.sort(intervals, (a, b) -> a[0] - b[0]);list.add(intervals[0]);for (int i = 1; i < intervals.length; i++) {int[] last = list.get(list.size() - 1);if (intervals[i][0] <= last[1]) {last[1] = Math.max(intervals[i][1], last[1]);} else {list.add(intervals[i]);}}return list.toArray(new int[list.size()][]);}
}
Unique Paths - LeetCode
dp解法
class Solution {public int uniquePaths(int m, int n) {int[][] dp = new int[m][n];for (int i = 0; i < m; i++) {dp[i][0] = 1;}for (int j = 0; j < n; j++) {dp[0][j] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
}
Convex Polygon - LeetCode
纯几何题,要记住公式
class Solution {public boolean isConvex(List<List<Integer>> points) {int n = points.size();long pre = 0;for (int i = 0; i < n; i++) {int x1 = points.get((i + 1) % n).get(0) - points.get(i).get(0);int x2 = points.get((i + 2) % n).get(0) - points.get(i).get(0);int y1 = points.get((i + 1) % n).get(1) - points.get(i).get(1);int y2 = points.get((i + 2) % n).get(1) - points.get(i).get(1);long cur = x1 * y2 - x2 * y1;if (cur != 0) {if (cur * pre < 0) {return false;} pre = cur;}}return true;}
}
Predict the Winner - LeetCode
找到一个比较好理解的递归的解法,但估计面试会要求用dp来解
class Solution {public boolean predictTheWinner(int[] nums) {return first(nums, 0, nums.length - 1) >= second(nums, 0, nums.length - 1);}private int first(int[] nums, int left, int right) {if (left == right) {return nums[left];}return Math.max(nums[left] + second(nums, left + 1, right), nums[right] + second(nums, left, right - 1));}private int second(int[] nums, int left, int right) {if (left == right) {return 0;}return Math.min(first(nums, left + 1, right), first(nums, left, right - 1));}
}
Cat and Mouse - LeetCode
这道题据说当年周赛的时候国服没有一个人做出来,好不容易找到个视频看懂了,跟着把C++代码改成了Java,竟然越界了。。。这题好像最好的解法是拓扑排序。这个解法是三维DP,我觉得逻辑很清晰呀。
class Solution {int[][] graph;int n;public int catMouseGame(int[][] graph) {this.graph = graph;this.n = graph.length;int[][][] dp = new int[n][n][2 * n * n];for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {for (int k = 0; k < 2 * n * n; k++) {dp[i][j][k] = -1;}}}return helper(1, 2, 0, dp);}private int helper(int mouse, int cat, int step, int[][][] dp) {if (dp[mouse][cat][step] == -1) {//打平if (step >= 2 * n * n) {dp[mouse][cat][step] = 0;return 0;//老鼠赢} else if (mouse == 0) {dp[mouse][cat][step] = 1;return 1;//猫赢} else if (mouse == cat) {dp[mouse][cat][step] = 2;return 2;//搜索} else {int res;//老鼠先走if (step % 2 == 0) {//最坏结果是猫赢res = 2;for (int e : graph[mouse]) {if (e == 0) continue;int risk = helper(e, cat, step + 1, dp);if (risk == 2) {continue;} else {//平局res = risk;//赢if (risk == 1) {res = 1;break;}}}dp[mouse][cat][step] = res;} else {res = 1;for (int e : graph[cat]) {int risk = helper(mouse, e, step + 1, dp);if (risk == 1) {continue;} else {//平局res = risk;//赢if (risk == 2) {res = 2;break;}}}dp[mouse][cat][step] = res;}}}return dp[mouse][cat][step];}
}
Shortest Path in Binary Matrix - LeetCode
经典BFS题,最短距离,也可以用A*来做
class Solution {public int shortestPathBinaryMatrix(int[][] grid) {if (grid[0][0] == 1) return -1;int m = grid.length;int n = grid[0].length;if (grid[m - 1][n - 1] == 1) return -1;Queue<int[]> queue = new LinkedList<>();queue.add(new int[]{0, 0, 1});grid[0][0] = 1;int[][] dirs = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}, {1, 1}, {-1, -1}, {1, -1}, {-1, 1}};while (!queue.isEmpty()) {int size = queue.size();for (int i = 0; i < size; i++) {int[] cur = queue.poll();if (cur[0] == m - 1 && cur[1] == n - 1) return cur[2];for (int[] dir : dirs) {int x = cur[0] + dir[0];int y = cur[1] + dir[1];if (x >= 0 && y >= 0 && x < m && y < m && grid[x][y] == 0) {queue.add(new int[]{x, y, cur[2] + 1});grid[x][y] = 1;}}}}return -1;}
}
还有一些没有Leetcode原题的
这么几道题竟然弄了一个星期!!!效率实在太低了。今天在地理发现了一份非常完整的面经,感觉自己真的是弱爆了,我要去刷那份面经了。
相关文章:
面经整理1
感觉好几个都是backtracking Letter Combinations of a Phone Number - LeetCode 典型的backtracking,注意String的处理 class Solution {String[] keyboard new String[]{"", "", "abc","def","ghi","…...
ChatGPT个人专用版 SSRF漏洞复现(CVE-2024-27564)
0x01 产品简介 ChatGPT个人专用版是一种基于 OpenAI 的 GPT-3.5 、GPT-4.0语言模型的产品。它是设计用于 Web 环境中的聊天机器人,旨在为用户提供自然语言交互和智能对话的能力。PHP版调用OpenAI接口进行问答和画图,采用Stream流模式通信,一边生成一边输出。前端采用EventS…...
Python中的可哈希与不可哈希对象详解
文章目录 1. 前置知识:哈希是什么2. 可哈希和不可哈希对象的定义2.1可哈希2.2 不可哈希 3. 对象的哈希方法3.1 自定义对象的哈希方法3.2 可哈希性与等价性3.3 哈希值的用途 推荐 在复习可变对象和不可变对象时,学到了这个内容 1. 前置知识:哈…...
【嵌入式DIY实例】-DIY速度计
DIY速度计 文章目录 DIY速度计1、硬件准备1.1 NEO-6M GPS模块介绍1.2 硬件接线原理图2、代码实现本文将介绍如何使用模拟仪表和 GPS 模块制作 DIY Arduino 速度计。 仪表用于显示当前速度,而GPS模块用于实时跟踪速度。 该项目将 Arduino 板与 GPS 模块相结合,在经典模拟仪表上…...
1.0 Hadoop 教程
1.0 Hadoop 教程 分类 Hadoop 教程 Hadoop 是一个开源的分布式计算和存储框架,由 Apache 基金会开发和维护。 Hadoop 为庞大的计算机集群提供可靠的、可伸缩的应用层计算和存储支持,它允许使用简单的编程模型跨计算机群集分布式处理大型数据集…...
【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波(文末附3个算法源码)
效果: MPU6050姿态解算-卡尔曼滤波+四元数+互补滤波 目录 基础知识详解 欧拉角...
智能水务系统:构建高效节水的城市水网
随着城市化进程的加速和人民生活水平的提高,对水务管理的需求也越来越高。传统的水务管理方式已经无法满足现代社会的需求,而智能水务系统的出现为水务管理带来了新的变革。本文将从项目背景、需求分析、建设目标、建设内容、技术方案、安全设计等方面&a…...
【JavaEE初阶系列】——网络编程 UDP客户端/服务器 程序实现
目录 🚩UDP和TCP之间的区别 🎈TCP是有连接的 UDP是无连接的 🎈TCP是可靠传输 UDP是不可靠传输 🎈TCP是面向字节流 UDP是面向数据报 🎈TCP和UDP是全双工 👩🏻💻UDP的socket ap…...
数据结构复习指导之绪论(算法的概念以及效率的度量)
文章目录 绪论: 2.算法和算法评价 知识总览 2.1算法的基本概念 知识点回顾与重要考点 2.2算法效率的度量 知识总览 1.时间复杂度 2.空间复杂度 知识点回顾与重要考点 归纳总结 绪论: 2.算法和算法评价 知识总览 2.1算法的基本概念 算法( Al…...
C语言经典例题(23)
1.求n的阶乘。(不考虑溢出) #include <stdio.h>int fac(int n);int main() {int n 0;scanf("%d", &n);int sum fac(n);printf("%d", sum);return 0; }int fac(int n) {if (n > 1){return n * fac(n - 1);}elsereturn 1; }2.求第n个斐波那契…...
Gitea的简单介绍
Gitea 是一个自由、开源、轻量级的 Git 服务程序。它是为了建立一个易于使用的、类似 GitHub 的 Git 服务而创建的。Gitea 采用 Go 语言编写,具有简单、快速、易于安装和配置的特点。 Gitea 提供了一个基本的 Web 界面,可以方便地进行代码托管、问题跟踪、协作等操作。用户可…...
Qt信号与槽
我们在使用Qt的时候,不使用Qt Designer 的方式进行开发,使用ui文件,信号与槽的连接方式是生成代码之后才能在setupUi函数里才能看到,或者需要进入Ui设计器里的信号槽模式里才能看到信号槽的连接。所以我们最好使用代码绘制界面。 …...
QQ农场-phpYeFarm添加数据教程
前置知识 plugin\qqfarm\core\data D:\study-project\testweb\upload\source\plugin\qqfarm\core\data 也就是plugin\qqfarm\core\data是一个缓存文件,如果更新农场数据后,必须要删除才可以 解决种子限制(必须要做才可以添加成功) 你不更改加入了id大于2000直接删除种子 D…...
Java中创建多线程的方法
继承Thread类,对该类进行new一个实例,对实例调用start方法,重写run方法。 缺点:单继承,无法继承 public class myThread extends Thread {public static void main(String[] args) {myThread myThread new myThread()…...
MT3020 任务分配
思路:利用二分找到某个时间是满足“k个人可以完成” ,并且时间最小。 因为尽量让后面的人做任务,所以从后往前排任务(倒着分配)。从后往前遍历任务,如果此人加上这个任务超出之前求得的时间,就…...
【Redis】事务
Redis事务是一组命令的集合。这组命令顺序化执行而不会被其他命令插入。 Redis事务命令 命令描述DISCARD取消事务,放弃执行EXEC执行事务MULTI标记事务的开始UNWATCH取消WATCH对所有key的监控WATCH监控所有key Redis事务特点 特点说明单独的隔离操作Redis命令执行…...
每日一题(leetcode238):除自身以外数组的乘积--前缀和
不进阶是创建两个数组: class Solution { public:vector<int> productExceptSelf(vector<int>& nums) {int nnums.size();vector<int> left(n);vector<int> right(n);int mul1;for(int i0;i<n;i){mul*nums[i];left[i]mul;}mul1;for…...
内网通如何去除广告,内网通免广告生成器
公司使用内网通内部传输确实方便!但是会有广告弹窗推送!这个很烦恼!那么如何去除广告呢! 下载: 链接:https://pan.baidu.com/s/1CVVdWexliF3tBaFgN1W9aw?pwdhk7m 提取码:hk7m ID:…...
视频知识整理
1 视频播放器原理 视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤: 解协议:将流媒体协议的数据,解析为标准的相应的封装格式数据 解封装:将封装格式的数据,分离成为音频流压缩编码数据和视…...
【2024】使用Rancher管理k8s集群和创建k8s集群
Rancher管理k8s集群及创建k8s集群。 Rancher版本为:2.8.2目录 rancher管理k8s集群rancher创建k8s集群rancher管理k8s集群 使用rancher管理已经存在的k8s集群。 本部分内容需要自行准备好k8s集群及rancher平台,部署请看本人其他文章 。 登录到rancher平台后,点击集群管理,…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
