面经整理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平台后,点击集群管理,…...
生成对抗网络 – Generative Adversarial Networks | GAN
目录 生成对抗网络 GAN 的基本原理 非大白话版本 第一阶段:固定「判别器D」,训练「生成器G」...
基于深度学习的生活垃圾智能分类系统(微信小程序+YOLOv5+训练数据集+开题报告+中期检查+论文)
摘要 本文基于Python技术,搭建了YOLOv5s深度学习模型,并基于该模型研发了微信小程序的垃圾分类应用系统。本项目的主要工作如下: (1)调研了移动端垃圾分类应用软件动态,并分析其优劣势;分析了深…...
软件包名生成参考
服务名称-分支名称-最后提交时间(精确到秒)-最后提交-编译时间(unix时间戳) 示例:crm_5.2_221024-221020160306-b846f829-1665655859 包名生成脚本参考: 分支名称 export GIT_BRANCH$(git branch|grep "\*"|head -n1|awk {print $NF})git最…...
八大排序算法(面试被问到)
1.八大排序算法都是什么? 八大排序算法有:插入排序、冒泡排序、归并排序、选择排序、快速排序、希尔排序、堆排序、基数排序(通常不提)。此外,还可以直接调用Arrays.sort()进行排序。 2.八大排序算法时间复杂度和稳定…...
SCP指令详细使用介绍
SCP(Secure Copy Protocol)是一种用于在计算机之间安全地传输文件的协议。它通过加密的方式在网络上安全地复制文件。SCP基于SSH(Secure Shell)协议,因此它提供了加密的连接和身份验证,确保数据在传输过程中…...
《前端面试题》- JS基础 - 防抖和节流
在界面触发点击,滚动,输入校验等事件时,如果对事件的触发频率不加以限制,会给浏览器增加负担,且对用户不友好。防抖和节流就是针对类似情况的解决方案。 防抖 防抖(debounce):当连续触发事件时࿰…...
RAGFlow:基于OCR和文档解析的下一代 RAG 引擎
一、引言 在人工智能的浪潮中,检索增强生成(Retrieval-Augmented Generation,简称RAG)技术以其独特的优势成为了研究和应用的热点。RAG技术通过结合大型语言模型(LLMs)的强大生成能力和高效的信息检索系统…...
正则表达式|*+?
在理解编程语言和编译技术的上下文中,了解正则表达式(regular expressions)和正则集(regular sets)的概念是非常重要的。这些概念主要用于描述一组字符串的模式,广泛应用于词法分析中识别各类标记ÿ…...
前端开发攻略---根据音频节奏实时绘制不断变化的波形图。深入剖析如何通过代码实现音频数据的可视化。
1、演示 2、代码分析 逐行解析 JavaScript 代码块: const audioEle document.querySelector(audio) const cvs document.querySelector(canvas) const ctx cvs.getContext(2d)这几行代码首先获取了 <audio> 和 <canvas> 元素的引用,并使用…...
【计算机毕业设计】基于Java+SSM的实战开发项目150套(附源码+演示视频+LW)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 🧡今天给大家分享150的Java毕业设计,基于ssm框架,这些项目都经过精心挑选,涵盖了不同的实战主题和用例,可做毕业设计和课程…...
保温管有哪些网站做/google chrome官网下载
Dan Griffin本文讨论: 新的凭据提供程序体系结构 为什么弃用了基于 GINA 的身份验证 多因素 (Multi-factor) 身份验证 开发和调试凭据提供程序 本文使用了以下技术: Windows Vista、C目录 新旧两种体系结构的比较 混合凭据提供程序 要求 设计 混合凭据提供程序 混合方式的实现…...
武进网站建设价格/技术教程优化搜索引擎整站
有时候数组要转为对象操作,用对象的指向操作符,有两种方法 方法一: $arr[a>10,b>100,c>Hello];$obj(Object)$arr;echo output:.$obj->c;方法二:$arr[a>10,b>100,c>Hello];$arr0 json_encode($arr);$arr1 j…...
网站描述优化/做百度推广怎么做才能有电话
Activity进场和出场动画从MainActivity进入到SecondActivity,再点击返回键从SecondActivity进入到MainActivity这样一个过程中如何设置两个Activity创建和销毁的动画呢?第一步:在MainActivity设置Intent进入SecondActivity的代码:…...
卖挂的网站怎么做/手机怎么建自己的网站
Android 资源(Resources)访问有许多东西用来构建一个优秀的 Android 应用程序。除了应用程序的编码,你需要关注各种各样的资源,诸如你用到的各种静态内容,如位图,颜色,布局定义,用户界面字符串,…...
注册登录/安卓优化大师新版
1.实现如下类之间的继承关系,并编写Music类来测试这些类。 package workhome0922休息;public class People {protected double height;protected double weight;public double getHeight() {return height;}public void setHeight(double height) {this.height hei…...
弄美团网站的一般一个做赚多少钱/外媒头条最新消息
我的有道云笔记 React 事件: 1、不能使用 return false; 来阻止元素的默认行为。需要在方法的最前面使用 e.preventDefault() 来阻止元素的默认行为(例如:a 标签的跳转链接行为); 2、在 React 中 e 是一个合成事件&…...