面试经典150题【141-150】

文章目录

  • 面试经典150题【141-150】
    • 208.实现前缀树(Trie树)
    • 211. 添加与搜索单词-数据结构设计
    • 212.单词搜索II
    • 200.岛屿数量
    • 130.被围绕的区域
    • 133.克隆图
    • 399.除法求值(未做)
    • 拓扑排序
    • 207.课程表
    • 210.课程表II

面试经典150题【141-150】

208.实现前缀树(Trie树)

在这里插入图片描述
对于sea,sells,she的Trie树
在这里插入图片描述
当然其真实是这样的
在这里插入图片描述首先一个多叉树里面应该有两个属性,是否结尾,下面的元素。
添加的时候,如果没有,就新增一个TrieNode就行。
判断是否存在这个单词,要看最后一位的isEnd。

class Trie {class TireNode {private boolean isEnd;TireNode[] next;public TireNode() {isEnd = false;next = new TireNode[26];}}private TireNode root;public Trie() {root = new TireNode();}public void insert(String word) {TireNode node = root;for (char c : word.toCharArray()) {if (node.next[c - 'a'] == null) {node.next[c - 'a'] = new TireNode();}node = node.next[c - 'a'];}node.isEnd = true;}public boolean search(String word) {TireNode node = root;for (char c : word.toCharArray()) {node = node.next[c - 'a'];if (node == null) {return false;}}return node.isEnd;}public boolean startsWith(String prefix) {TireNode node = root;for (char c : prefix.toCharArray()) {node = node.next[c - 'a'];if (node == null) {return false;}}return true;}
}

211. 添加与搜索单词-数据结构设计

在这里插入图片描述
在上一题的基础上,对于搜索部分加了一个DFS

class WordDictionary {class TireNode {private boolean isEnd;public TireNode[] next;public TireNode() {isEnd = false;next = new TireNode[26];}}private TireNode root;public WordDictionary() {root = new TireNode();}public void addWord(String word) {TireNode node = root;for (char c : word.toCharArray()) {if (node.next[c - 'a'] == null) {node.next[c - 'a'] = new TireNode();}node = node.next[c - 'a'];}node.isEnd = true;}public boolean search(String word) {return search(root, word, 0);}public boolean search(TireNode root, String word, int start) {int n = word.length();if (n == start)return root.isEnd;char c = word.charAt(start);if (c != '.') {TireNode temp = root.next[c - 'a'];return temp != null && search(temp, word, start + 1);}for (int j = 0; j < 26; j++) {if (root.next[j] != null && search(root.next[j], word, start + 1))return true;}return false;}
}

212.单词搜索II

在这里插入图片描述
剪枝:我们可以使用 Trie结构进行建树,对于任意一个当前位置 (i,j)而言,只有在 Trie 中存在往从字符 a 到 b 的边时,我们才在棋盘上搜索从 a 到 b 的相邻路径。
需要将平时Trie中的isEnd属性变为String ,这样方便DFS的搜索

public class LC212 {class TireNode{String s;TireNode[] next;public TireNode() {next = new TireNode[26];}}Set<String> set = new HashSet<>();char[][] board;int n, m;TireNode root = new TireNode();int[][] dirs = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};boolean[][] vis = new boolean[15][15];void insert(String s){TireNode p=root;for(int i=0;i<s.length();i++){int u=s.charAt(i)-'a';if(p.next[u]==null) p.next[u]= new TireNode();p=p.next[u];}p.s=s;}public List<String> findWords(char[][] _board, String[] words) {board = _board;m = board.length; n = board[0].length;for (String w : words) insert(w);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {int u = board[i][j] - 'a';if (root.next[u] != null) {vis[i][j] = true;dfs(i, j, root.next[u]);vis[i][j] = false;}}}List<String>ans=new ArrayList<>();for(String s:set)ans.add(s);return ans;}public void dfs(int i,int j,TireNode node){if(node.s!=null) set.add(node.s);for(int[]d:dirs){int dx=i+d[0],dy=j+d[1];if(dx<0||dy<0||dx>(m-1)||dy>(n-1)) continue;if(vis[dx][dy]) continue;int u=board[dx][dy]-'a';if (node.next[u] != null) {vis[dx][dy] = true;dfs(dx, dy, node.next[u]);vis[dx][dy] = false;}}}
}

200.岛屿数量

在这里插入图片描述
用DFS,BFS,并查集应该都可以做。
DFS:

class Solution {public void dfs(char[][]grid,int r,int c) {int len1=grid.length;int len2=grid[0].length;grid[r][c]='0';if(r>0 && grid[r-1][c]=='1') dfs(grid, r-1, c);if(r<len1-1 && grid[r+1][c]=='1') dfs(grid, r+1, c);if(c>0 && grid[r][c-1]=='1') dfs(grid, r, c-1);if(c<len2-1 &&grid[r][c+1]=='1') dfs(grid, r, c+1);}public int numIslands(char[][] grid) {if(grid==null || grid.length==0) return 0;int ans=0;for(int i=0;i<grid.length;i++) {for(int j=0;j<grid[0].length;j++) {if(grid[i][j]=='1') {ans++;dfs(grid, i, j);}}}return ans;}}

当然对于DFS,更通用的模版是先访问,不管是否能访问。

class Solution {public void dfs(char[][]grid,int r,int c) {int len1=grid.length;int len2=grid[0].length;if(r<0 || r>len1-1 || c<0 || c>len2-1 || grid[r][c]=='0') return;grid[r][c]='0';dfs(grid, r-1, c);dfs(grid, r+1, c);dfs(grid, r, c-1);dfs(grid, r, c+1);}public int numIslands(char[][] grid) {if(grid==null || grid.length==0) return 0;int ans=0;for(int i=0;i<grid.length;i++) {for(int j=0;j<grid[0].length;j++) {if(grid[i][j]=='1') {ans++;dfs(grid, i, j);}}}return ans;}}

BFS:
太简单,不写了。
并查集:

class Solution {class UnionFind {int count;int[] parent;int[] rank;public UnionFind(char[][] grid) {count = 0;int m = grid.length;int n = grid[0].length;parent = new int[m * n];rank = new int[m * n];for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (grid[i][j] == '1') {parent[i * n + j] = i * n + j;++count;}rank[i * n + j] = 0;}}}public int find(int i) {if (parent[i] != i) parent[i] = find(parent[i]);return parent[i];}public void union(int x, int y) {int rootx = find(x);int rooty = find(y);if (rootx != rooty) {if (rank[rootx] > rank[rooty]) {parent[rooty] = rootx;} else if (rank[rootx] < rank[rooty]) {parent[rootx] = rooty;} else {parent[rooty] = rootx;rank[rootx] += 1;}--count;}}public int getCount() {return count;}}public int numIslands(char[][] grid) {if(grid==null || grid.length==0) return 0;int nc=grid[0].length;UnionFind uf=new UnionFind(grid);for(int i=0;i<grid.length;i++) {for(int j=0;j<grid[0].length;j++) {if(grid[i][j]=='1') {grid[i][j]='0';if(i>0 && grid[i-1][j]=='1') uf.union(i*nc+j,(i-1)*nc+j);if(j>0 && grid[i][j-1]=='1') uf.union(i*nc+j,i*nc+j-1);if(i< grid.length-1 && grid[i+1][j]=='1') uf.union(i*nc+j,(i+1)*nc+j);if(j< grid[0].length-1 && grid[i][j+1]=='1') uf.union(i*nc+j,i*nc+j+1);}}}return uf.getCount();}}

130.被围绕的区域

在这里插入图片描述
对所有的边缘O进行dfs遍历,将其变为#.再将所有的内陆的O变为X,再将#变为O即可。

class Solution {public void solve(char[][] board) {int len1=board.length;int len2=board[0].length;for(int i=0;i<len1;i++){for(int j=0;j<len2;j++){boolean isEdge = i==0 || i==len1-1 || j==0 || j==len2-1;if(isEdge && board[i][j]=='O'){dfs(board,i,j);}}}for(int i=0;i<len1;i++){for(int j=0;j<len2;j++){if(board[i][j]=='O') board[i][j]='X';if(board[i][j]=='#') board[i][j]='O';}}}public void dfs(char[][] board,int a,int b){if(a<0 || b<0 || a> board.length-1 ||b>board[0].length-1 || board[a][b]!='O') return;if(board[a][b]=='O') board[a][b]='#';dfs(board,a,b+1);dfs(board,a,b-1);dfs(board,a-1,b);dfs(board,a+1,b);}}

133.克隆图

太呆了这题感觉

/*
// Definition for a Node.
class Node {public int val;public List<Node> neighbors;public Node() {val = 0;neighbors = new ArrayList<Node>();}public Node(int _val) {val = _val;neighbors = new ArrayList<Node>();}public Node(int _val, ArrayList<Node> _neighbors) {val = _val;neighbors = _neighbors;}
}
*/class Solution {private HashMap<Node, Node> visited = new HashMap<>();public Node cloneGraph(Node node) {if (node == null) {return node;}// 如果该节点已经被访问过了,则直接从哈希表中取出对应的克隆节点返回if (visited.containsKey(node)) {return visited.get(node);}// 克隆节点,注意到为了深拷贝我们不会克隆它的邻居的列表Node cloneNode = new Node(node.val, new ArrayList());// 哈希表存储visited.put(node, cloneNode);// 遍历该节点的邻居并更新克隆节点的邻居列表for (Node neighbor : node.neighbors) {cloneNode.neighbors.add(cloneGraph(neighbor));}return cloneNode;}
}

399.除法求值(未做)

class Solution {public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {int nvars = 0;Map<String, Integer> variables = new HashMap<String, Integer>();int n = equations.size();for (int i = 0; i < n; i++) {if (!variables.containsKey(equations.get(i).get(0))) {variables.put(equations.get(i).get(0), nvars++);}if (!variables.containsKey(equations.get(i).get(1))) {variables.put(equations.get(i).get(1), nvars++);}}int[] f = new int[nvars];double[] w = new double[nvars];Arrays.fill(w, 1.0);for (int i = 0; i < nvars; i++) {f[i] = i;}for (int i = 0; i < n; i++) {int va = variables.get(equations.get(i).get(0)), vb = variables.get(equations.get(i).get(1));merge(f, w, va, vb, values[i]);}int queriesCount = queries.size();double[] ret = new double[queriesCount];for (int i = 0; i < queriesCount; i++) {List<String> query = queries.get(i);double result = -1.0;if (variables.containsKey(query.get(0)) && variables.containsKey(query.get(1))) {int ia = variables.get(query.get(0)), ib = variables.get(query.get(1));int fa = findf(f, w, ia), fb = findf(f, w, ib);if (fa == fb) {result = w[ia] / w[ib];}}ret[i] = result;}return ret;}public void merge(int[] f, double[] w, int x, int y, double val) {int fx = findf(f, w, x);int fy = findf(f, w, y);f[fx] = fy;w[fx] = val * w[y] / w[x];}public int findf(int[] f, double[] w, int x) {if (f[x] != x) {int father = findf(f, w, f[x]);w[x] = w[x] * w[f[x]];f[x] = father;}return f[x];}
}

少有的带权并查集

拓扑排序

最广泛的是用BFS去得到每一个入度为0的,直到最后。
如果只是判断能否成功,则DFS判断是否成环也可以。

207.课程表

在这里插入图片描述
注释很详尽

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {//一个可以执行的选课序列List<Integer>ans=new ArrayList<>();//每个元素的入度int[] indegrees = new int[numCourses];//邻接表List<List<Integer>> adjacency = new ArrayList<>();//BFS的队列Queue<Integer> queue = new LinkedList<>();//每一个元素在邻接表中都有一行for(int i=0;i<numCourses;i++){adjacency.add(new ArrayList<>());}//将邻接表和入度填充for(int[]cp:prerequisites){indegrees[cp[0]]++;adjacency.get(cp[1]).add(cp[0]);}//找到所有入度为0的课程for(int i=0;i<numCourses;i++){if(indegrees[i]==0) queue.add(i);}while(!queue.isEmpty()){int pre=queue.poll();ans.add(pre);for(int cur:adjacency.get(pre)){indegrees[cur]--;if(indegrees[cur]==0) queue.add(cur);}}return ans.size()==numCourses;}
}

210.课程表II

题目与上面的一样,只是要输出一个具体的选课列表。代码一模一样,最后转一下就行。

        if(ans.size()==numCourses){return ans.stream().mapToInt(Integer::valueOf).toArray();}return new int[0];

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

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

相关文章

CTF之社工-初步收集

题目就一个刷钻网站&#xff08;假的&#xff09; 扫描一下目录 发现还有一个登录界面 时间多的可以爆破一下&#xff08;反正我爆不出来&#xff09;&#xff0c;接着我们下载那个压缩包看看 发现是一个钓鱼小软件 没发现什么有用的信息那我们就去wireshark看看数据包喽&#…

Francek Chen 的128天创作纪念日

目录 Francek Chen 的128天创作纪念日机缘收获日常成就憧憬 Francek Chen 的128天创作纪念日 Francek Chen 的个人主页 机缘 不知不觉的加入CSDN已有两年时间了&#xff0c;最初我第一次接触CSDN技术社区是在2022年4月的时候&#xff0c;通过学长给我们推荐了几个IT社区平台&a…

从概念到实践:探索独立站在当代电商中的关键作用

随着数字化时代的到来&#xff0c;电子商务已成为全球商业生态的核心组成部分。在这个不断变化的市场中&#xff0c;独立站作为企业建立在线身份和拓展业务的强大工具&#xff0c;正逐步展现出其不可替代的价值。 从概念到实践&#xff0c;本文将深入探索独立站在当代电商中的关…

国内:深圳交通流量数据集

数据来源&#xff1a;深圳政府数据开放平台&#xff08;深圳市政府数据开放平台&#xff09;&#xff0c;这个官网上还有其他类数据集&#xff0c;值得收藏&#xff01;&#xff01;&#xff01; 数据集介绍&#xff1a;宝安区-G4高速西乡大道入口车流量统计 第一行每列的标题…

【卷积神经网络进展】

打基础日常记录 CNN基础知识1. 感知机2. DNN 深度神经网络&#xff08;全连接神经网络&#xff09;DNN 与感知机的区别DNN特点&#xff0c;全连接神经网络DNN前向传播和反向传播 3. CNN结构【提取特征分类】4. CNN应用于文本 CNN基础知识 1. 感知机 单层感知机就是一个二分类…

idea Springboot 电影推荐系统LayUI框架开发协同过滤算法web结构java编程计算机网页

一、源码特点 springboot 电影推荐系统是一套完善的完整信息系统&#xff0c;结合mvc框架和LayUI框架完成本系统springboot dao bean 采用协同过滤算法进行推荐 &#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&…

JAVA—抽象—定义抽象类Converter及其子类WeightConverter

同样&#xff0c;我们由这道题引出抽象类&#xff0c;抽象方法这个概念。 按下面要求定义类Converter及其子类WeightConverter 定义抽象类&#xff1a;Converter&#xff1a; 定义一个抽象类Converter&#xff0c;表示换算器&#xff0c;其定义的如下&#xff1a; 一个私有…

Git场景运用

git 脚本在开发中应用场景-CSDN博客 Git基础 Git基本运作流程 ​​​​​​​ (1) workspace->index->Repository ​ 本地写代码在workspace&#xff0c;add暂存到index&#xff0c;commit提交到本地Repository。多项目成员&#xff0c;每员对应本地仓库&#xff0c;各自…

机器学习(30)

文章目录 摘要一、文献阅读1. 题目2. abstract3. 网络架构3.1 Sequence Generative Adversarial Nets3.2 SeqGAN via Policy Gradient3.3 The Generative Model for Sequences3.4 The Discriminative Model for Sequences(CNN) 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过…

蓝桥杯刷题-13-子矩阵-二维滑动窗口 ಥ_ಥ

给定一个 n m &#xff08;n 行 m 列&#xff09;的矩阵。 设一个矩阵的价值为其所有数中的最大值和最小值的乘积。求给定矩阵的所有大小为 a b &#xff08;a 行 b 列&#xff09;的子矩阵的价值的和。 答案可能很大&#xff0c;你只需要输出答案对 998244353 取模后的结果。…

鸿蒙内核源码分析 (双向链表篇) | 谁是内核最重要结构体

双向链表是什么&#xff1f; 谁是鸿蒙内核最重要的结构体 &#xff1f; 一定是: LOS_DL_LIST(双向链表)&#xff0c; 它长这样。 typedef struct LOS_DL_LIST {struct LOS_DL_LIST *pstPrev; /**< Current nodes pointer to the previous node | 前驱节点(左手)*/struct L…

AFCI 应用笔记三、使用 mlflow 管理模型

1. 简介 由于 AI 神经网络涉及多种参数&#xff0c;需要频繁修改各种超参数&#xff0c;比如&#xff1a;learning rate&#xff0c;batchsize&#xff0c;filter numbers&#xff0c;alpha 等等&#xff0c;每个参数都有可能影响到模型最终的准确率&#xff0c;所以比较这些参…

如何保证全部流量走代理

最近因为某些原因&#xff0c;需要做一些确保高匿的事情&#xff0c;便花时间做了一定的调研&#xff0c;至于是什么事情这里不便多说。 本文主要还是聊聊我看到的一些使用代理软件误区和确保流量全部走代理的方法&#xff0c;甚至也可以说是Proxifier的用户使用手册&#xff…

2023年下半年中级软件设计师上午真题及答案解析

01 02 03 04 05 06 07 08 09 10 篇幅有限&#xff0c;私我获取免费完整 pdf文件

如何在Linux中安装软件

文章目录 一、Linux应用程序基础1.Linux软件安装包分类2.应用程序和系统命令的关系3.常见的软件包的封装类型 二、安装软件的方式1.RPM包管理工具2.yum安装3.编译 一、Linux应用程序基础 1.Linux软件安装包分类 Linux源码包&#xff1a; 实际上&#xff0c;源码包就是一大堆源…

海纳斯删除广告位

找到文件 vim /var/www/html/home.php 删除代码段 <div class"adleft" id"adleftContainer"><button onclick"closeAd()">关闭</button><a href"https://www.ecoo.top/ad.html" target"_blank">&l…

bugku-misc 啊哒

拿到题目得到一张图片 尝试查看属性看到照相机型号 应该是加密字符&#xff0c;用010打开图片查看源码 文件结尾看到50 4B&#xff0c;是压缩包形式并且看到flag.txt 猜测是文件包含 kali用foremost尝试分离图片 得到zip文件&#xff0c;打开显示需要密码 想到一开始图片属…

GESP Python编程五级认证真题 2024年3月

Python 五级 2024 年 03 月 1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 下面流程图在yr输入2024时&#xff0c;可以判定yr代表闰年&#xff0c;并输出 2月是29天 &#xff0c;则图中菱形框中应该填入&#xff08; &#xff09;。 A. (yr % 400 0…

LDR6328助力Type-C普及,便捷充电,绿色生活更精彩

随着科技的进步和全球统一接口的需求&#xff0c;Type-C接口正日益受到青睐。越来越多的设备正选择采纳这一先进的接口设计&#xff0c;它的普及无疑在改善着我们的日常生活。 在过往&#xff0c;许多小功率设备如小风扇、蓝牙音箱、桌面台灯以及家用加湿器等&#xff0c;都普遍…

在ChatGPT中,能用DALL·E 3编辑图片啦!

4月3日&#xff0c;OpenAI开始向部分用户&#xff0c;提供在ChatGPT中的DALLE 3图片编辑功能。 DALLE 3是OpenAI在2023年9月20日发布的一款文生图模型&#xff0c;其生成的图片效果可以与Midjourney、leonardo、ideogram等顶级产品媲美&#xff0c;随后被融合到ChatGPT中增强其…