Java面试黄金宝典18
1. 如何找到一条单链表的中间结点
- 定义
单链表是一种常见的数据结构,每个节点包含数据和指向下一个节点的指针。找到单链表的中间结点,即找出链表中位于中间位置的节点。可借助快慢指针法达成,快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针正好处于链表中间。
- 要点
- 初始化快慢指针,使其都指向链表的头节点。
- 快指针移动速度为慢指针的两倍。
- 当快指针抵达链表末尾(快指针为空或者快指针的下一个节点为空)时,慢指针所指即为中间节点。
代码示例
java
class ListNode {int val;ListNode next;ListNode(int x) { val = x; }
}public class MiddleOfLinkedList {public ListNode middleNode(ListNode head) {ListNode slow = head;ListNode fast = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}public static void main(String[] args) {ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(4);head.next.next.next.next = new ListNode(5);MiddleOfLinkedList solution = new MiddleOfLinkedList();ListNode middle = solution.middleNode(head);System.out.println(middle.val);}
}
- 应用
- 链表数据处理:在对链表进行分治操作时,可将链表从中间断开,分别处理左右两部分。
- 链表对折操作:实现链表对折功能时,需要先找到中间节点。
2. 从 10 亿个数中找不重复的数
- 定义
在海量数据(如 10 亿个数)中找出不重复的数,可采用位图(BitMap)或者哈希表结合分治的方法。位图是用一个二进制位来表示一个数是否出现过;哈希表结合分治则是把大数据拆分成多个小文件,对每个小文件用哈希表统计数字出现次数,最后汇总结果。
- 要点
- 位图:依据数据范围确定位图大小,运用位运算操作位图。
- 哈希表结合分治:合理划分小文件,防止小文件过大导致内存不足。
代码示例(位图)
java
import java.util.BitSet;public class FindUniqueNumbers {public static void findUnique(int[] numbers) {BitSet bitSet = new BitSet();BitSet repeated = new BitSet();for (int num : numbers) {if (bitSet.get(num)) {repeated.set(num);} else {bitSet.set(num);}}for (int i = 0; i < bitSet.size(); i++) {if (bitSet.get(i) && !repeated.get(i)) {System.out.println(i);}}}public static void main(String[] args) {int[] numbers = {1, 2, 2, 3, 4, 4, 5};findUnique(numbers);}
}
- 应用
- 数据去重:在海量数据里找出唯一的数据。
- 数据库索引优化:去除重复的索引键,提升数据库性能。
3. 判断二叉树是否为平衡二叉树
- 定义
平衡二叉树,也叫 AVL 树,其每个节点的左右子树高度差不超过 1,并且左右子树也都是平衡二叉树。可通过递归方法计算每个节点的左右子树高度,以此判断高度差是否满足条件。
- 要点
- 递归计算左右子树的高度。
- 判断每个节点的左右子树高度差是否不超过 1。
代码示例
java
class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
}public class BalancedBinaryTree {public boolean isBalanced(TreeNode root) {return height(root) != -1;}private int height(TreeNode node) {if (node == null) {return 0;}int leftHeight = height(node.left);if (leftHeight == -1) {return -1;}int rightHeight = height(node.right);if (rightHeight == -1) {return -1;}if (Math.abs(leftHeight - rightHeight) > 1) {return -1;}return Math.max(leftHeight, rightHeight) + 1;}public static void main(String[] args) {TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);BalancedBinaryTree solution = new BalancedBinaryTree();System.out.println(solution.isBalanced(root));}
}
- 应用
- 数据库索引结构:维持树的平衡能够提高数据库查询效率。
- 搜索引擎索引构建:使用平衡二叉树可快速定位数据。
4. 50.0G 文件的淘宝商品编号,只有 512M 内存,怎么判断究竟是不是合法编号(即编号是否存在)
- 定义
处理大文件(如 50.0G 的淘宝商品编号文件)且内存有限(仅 512M)时,要判断编号是否合法,可采用分治和哈希的思想。把大文件拆分成多个小文件,对每个小文件进行哈希处理,然后将小文件加载到内存中查找。还可使用布隆过滤器先进行快速过滤,减少不必要的文件读取。
- 要点
- 合理划分小文件,保证每个小文件能加载到内存中。
- 运用哈希函数处理编号,便于快速查找。
- 布隆过滤器可快速判断编号是否可能存在。
- 实现步骤
- 遍历大文件,依据编号的哈希值将编号划分到不同的小文件中。
- 对于要查询的编号,计算其哈希值,确定对应的小文件。
- 将小文件加载到内存中,使用哈希表或其他数据结构进行查找。
- 可使用布隆过滤器在加载小文件之前进行快速判断。
- 应用
- 大数据量文件查询:例如在日志文件中查找特定记录。
- 电商平台商品编号验证:确保商品编号的合法性。
5. 假如淘宝存着一个包含 10w 个敏感词的词库,紧接着需要从多个商品标题中随机抽查 3 个有没有包含敏感词的商品
- 定义
在拥有大量敏感词(如 10w 个)的词库情况下,从多个商品标题中随机抽取部分标题,检查其中是否包含敏感词。可借助 Trie 树(字典树)存储敏感词库,通过遍历商品标题在 Trie 树中查找是否存在敏感词。
- 要点
- 构建 Trie 树存储敏感词库。
- 遍历商品标题,在 Trie 树中查找是否存在敏感词。
代码示例
java
class TrieNode {TrieNode[] children = new TrieNode[26];boolean isEndOfWord;
}class Trie {private TrieNode root;public Trie() {root = new TrieNode();}public void insert(String word) {TrieNode node = root;for (char c : word.toCharArray()) {int index = c - 'a';if (node.children[index] == null) {node.children[index] = new TrieNode();}node = node.children[index];}node.isEndOfWord = true;}public boolean search(String word) {TrieNode node = root;for (char c : word.toCharArray()) {int index = c - 'a';if (node.children[index] == null) {return false;}node = node.children[index];}return node.isEndOfWord;}
}import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class SensitiveWordCheck {public static boolean checkSensitiveWords(List<String> sensitiveWords, String title) {Trie trie = new Trie();for (String word : sensitiveWords) {trie.insert(word);}for (int i = 0; i < title.length(); i++) {for (int j = i + 1; j <= title.length(); j++) {String sub = title.substring(i, j);if (trie.search(sub)) {return true;}}}return false;}public static void main(String[] args) {List<String> sensitiveWords = new ArrayList<>();sensitiveWords.add("敏感词1");sensitiveWords.add("敏感词2");List<String> titles = new ArrayList<>();titles.add("这是一个包含敏感词1的标题");titles.add("这是一个正常标题");titles.add("这是另一个包含敏感词2的标题");Random random = new Random();for (int i = 0; i < 3; i++) {int index = random.nextInt(titles.size());String title = titles.get(index);boolean hasSensitiveWord = checkSensitiveWords(sensitiveWords, title);System.out.println("标题: " + title + " 是否包含敏感词: " + hasSensitiveWord);}}
}
- 应用
- 内容审核:像论坛、博客等平台的帖子审核。
- 电商平台商品标题审核:保证商品标题合规。
6. 如何查找中间链表元素
- 定义
同问题 1,单链表查找中间元素可使用快慢指针法。快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针处于链表中间。
- 要点
- 初始化快慢指针,使其都指向链表的头节点。
- 快指针移动速度为慢指针的两倍。
- 当快指针抵达链表末尾(快指针为空或者快指针的下一个节点为空)时,慢指针所指即为中间节点。
代码示例
java
class ListNode {int val;ListNode next;ListNode(int x) { val = x; }
}public class MiddleOfLinkedList {public ListNode middleNode(ListNode head) {ListNode slow = head;ListNode fast = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}public static void main(String[] args) {ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(4);head.next.next.next.next = new ListNode(5);MiddleOfLinkedList solution = new MiddleOfLinkedList();ListNode middle = solution.middleNode(head);System.out.println(middle.val);}
}
- 应用
- 链表数据处理:对链表进行分治操作时,可从中间断开链表分别处理。
- 链表对折操作:实现链表对折功能时,需先找到中间节点。
7. 什么是图算法
- 定义
图算法是用于处理图数据结构的一系列算法。图由顶点和边构成,图算法能够解决图的遍历、最短路径、连通性、拓扑排序等问题。
- 常见图算法
- 深度优先搜索(DFS):沿着图的深度遍历节点,尽可能深地搜索分支。
- 广度优先搜索(BFS):从起始节点开始,逐层地访问节点。
- Dijkstra 算法:用于求解单源最短路径问题。
- Floyd - Warshall 算法:用于求解所有节点对之间的最短路径问题。
- Kruskal 算法和 Prim 算法:用于求解最小生成树问题。
- 应用
- 社交网络分析:如好友推荐、社区发现。
- 地图导航:如最短路径规划。
- 电路设计:如电路连通性分析。
8. 什么是平衡树的旋转
- 定义
平衡树(如 AVL 树、红黑树)在插入或删除节点后,可能会破坏树的平衡性质。平衡树的旋转是一种调整树结构的操作,能使树重新满足平衡条件。旋转操作分为左旋和右旋。
- 左旋
- 原理:以某个节点为支点,将其右子树提升为根节点,原根节点变为新根节点的左子树,新根节点的左子树变为原根节点的右子树。
- 作用:调整树的高度,使树保持平衡。
- 右旋
- 原理:以某个节点为支点,将其左子树提升为根节点,原根节点变为新根节点的右子树,新根节点的右子树变为原根节点的左子树。
- 作用:调整树的高度,使树保持平衡。
- 应用
- 数据库索引结构:保持树的平衡可提高数据库查询效率。
- 搜索引擎索引构建:使用平衡树可快速定位数据。
9. 动态规划的思想
- 定义
动态规划是一种算法策略,通过把原问题分解为相对简单的子问题,并保存子问题的解来避免重复计算,从而解决复杂问题。
- 要点
- 最优子结构:问题的最优解包含子问题的最优解。
- 子问题重叠:求解过程中会多次遇到相同的子问题。
- 状态转移方程:定义子问题之间的关系,通过已知子问题的解推导出当前问题的解。
- 应用
- 背包问题:如 0 - 1 背包问题、完全背包问题。
- 最长公共子序列问题:在字符串处理等场景有应用。
- 最短路径问题:如 Floyd - Warshall 算法。
10. 给出一个字符数组,找出第一个出现次数最多的字符,注意是第一个
- 定义
给定一个字符数组,要找出其中第一个出现次数最多的字符。可使用哈希表记录每个字符的出现次数,同时记录最大出现次数和第一个达到最大出现次数的字符。
- 要点
- 遍历字符数组,更新哈希表中字符的出现次数。
- 记录最大出现次数和第一个达到最大出现次数的字符。
代码示例
java
public class FirstMaxOccurrenceChar {public static char findFirstMaxOccurrence(char[] chars) {int[] count = new int[256];int maxCount = 0;char result = '\0';for (char c : chars) {count[c]++;if (count[c] > maxCount) {maxCount = count[c];result = c;}}return result;}public static void main(String[] args) {char[] chars = {'a', 'b', 'c', 'a', 'b', 'a'};char maxChar = findFirstMaxOccurrence(chars);System.out.println("第一个出现次数最多的字符是: " + maxChar);}
}
- 应用
- 文本分析:统计文本中出现频率最高的字符。
- 密码学:分析字符出现频率以破解密码。
友情提示:本文已经整理成文档,可以到如下链接免积分下载阅读
https://download.csdn.net/download/ylfhpy/90539000
相关文章:
Java面试黄金宝典18
1. 如何找到一条单链表的中间结点 定义 单链表是一种常见的数据结构,每个节点包含数据和指向下一个节点的指针。找到单链表的中间结点,即找出链表中位于中间位置的节点。可借助快慢指针法达成,快指针每次移动两步,慢指针每次移动…...
设计秒杀系统(高并发的分布式系统)
学海无涯,志当存远。燃心砺志,奋进不辍。 愿诸君得此鸡汤,如沐春风,事业有成。 若觉此言甚善,烦请赐赞一枚,共励学途,同铸辉煌! 思路 处理高并发 流量削峰:限流…...
【面试题】利用Promise实现Websocket阻塞式await wsRequest() 请求
逻辑实现过程 1. 目标与基础设计 目标:实现一个类似 HTTP 请求的阻塞式调用接口(如 await wsRequest(...)),让开发者无需手动处理 WebSocket 的事件回调,而是通过 Promise 和 async/await 获得同步体验。 基础设计&a…...
数据库----单表、多表
数据库 create database 数据库名称;---创建数据库create database 数据库名称 default charsetutf8mb4;---创建数据库,同时指定编码show databases;---查看当前数据库管理下存在多少数据库show databases like "db_%";---查询以db_开头的数据库select d…...
ubuntu 22.04 一键安装 lxd
LXD系列 LXD是一个现代、安全且功能强大的系统容器和虚拟机管理器。 它为在容器或虚拟机中运行和管理完整的 Linux 系统提供了统一的体验。LXD 支持大量 Linux 发行版的映像(官方 Ubuntu 映像和社区提供的映像),并且围绕...
HO与OH差异之Navigation三
在上一篇内容中我们介绍了HO与OH差异之Navigator,我们也了解了Navigator的基本概念和大致了解了一下他的基础用法,既然谈到差异肯定就不止这两种差异,今天就让我们来了解第三种差异NavRouter,其中在HO中我们并没有这种路由方式但是…...
Zookeeper运维指南:服务端与客户端常用命令详解
#作者:任少近 文章目录 1 Zookeeper服务端常用命令2 Zookeeper客户端常用命令2.1Ls命令2.2创建节点create2.3Get命令2.4删除命令2.5修改命令 1 Zookeeper服务端常用命令 启动ZK服务: bin/zkServer.sh start # ./zkServer.sh startZooKeeper JMX enabled by defau…...
linux scp复制多层级文件夹到另一服务器免密及脚本配置
文章目录 生成 SSH 密钥对将公钥复制到目标服务器验证免密登录scp 多级文件夹复制脚本 生成 SSH 密钥对 在本地机器上,使用 ssh-keygen 命令生成 SSH 密钥对。打开终端并执行以下命令: ssh-keygen -t rsa 按提示连续按回车键,默认会在 ~/.ss…...
模型压缩与迁移:基于蒸馏技术的实战教程
1.前言 模型蒸馏(Model Distillation),又称为知识蒸馏(Knowledge Distillation),是一种将大型、复杂的模型(通常称为教师模型,Teacher Model)的知识转移到小型、简单模型…...
XSS通关技巧
目录 第一关: 第二关: 第三关: 第四关: 第五关: 第六关: 第七关: 第八关: 第九关: 第十关: 第十一关: 第十二关: 第十三关:…...
el-tree树多选,将选中的树对象中某个字段值改为true,并过滤出所有为true的对象,组成新的数组
功能实现: el-tree树多选,将选中的树对象中某个字段值改为true,并过滤出所有为true的对象,组成新的数组提交给后端 <template><div><!-- 树形菜单 --><el-tree:data"stageList"show-checkboxdefault-expand-…...
大文件版本管理git-lfs
1. 安装 Git Large File Storage (LFS) 是一个 开源的 Git 扩展,用于替换 Git 仓库中的大文件,用指针文件替代实际的大文件,可以在保持仓库轻量级的同时,有效地管理大型文件。 如果install提示失败,多试几次…...
Android RemoteViews:跨进程 UI 更新的奥秘与实践
目录 一、RemoteViews 的舞台:使用场景 (一)通知栏:动态交互的窗口 (二)桌面小部件:桌面上的动态名片 二、RemoteViews 的本质:定义与架构 (一)什么是 RemoteViews? (二)架构设计:层次分明的协作 (三)操作限制:能力边界在哪里? 三、RemoteViews 的引擎…...
es 3期 第27节-运用Script脚本实现复杂需求
#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性ÿ…...
玩转python: 掌握Python常用库之数据分析pandas
pandas是Python中最强大的数据处理和分析库之一,它提供了高效、灵活且易于使用的数据结构,使数据清洗、转换和分析变得简单直观。 1、pandas库简介 pandas由Wes McKinney于2008年开发,名称来源于"panel data"(面板数据…...
融合YOLO11与行为树的人机协作智能框架:动态工效学优化与自适应安全决策
人工智能技术要真正发挥其价值,必须与生产生活深度融合,为产业发展和人类生活带来实际效益。近年来,基于深度学习的机器视觉技术在工业自动化领域取得了显著进展,其中YOLO(You Only Look Once)算法作为一种…...
Postgresql源码(142)子查询提升pull_up_sublinks
1 案例 drop table t_fun01; create table t_fun01 (image_id numeric primary key, content_id varchar(50), file_code varchar(20)); create index idx3 on t_fun01(content_id); create index idx4 on t_fun01(file_code); insert into t_fun01 select t.i, t.i%10, t.i%1…...
通过 ECNWP 洋流、海浪可视化开发的方法和架构
第一篇:ECNWP 洋流、海浪可视化开发方法 1. 数据获取与预处理 ECNWP(Eastern Central North Pacific)区域的洋流和海浪数据通常来源于 NOAA、EMC 等权威机构。数据包括流速、流向、波高、波向、周期等。 代码示例:数据下载与预处理 import pandas as pd import numpy as…...
如何 编译 px4
DeepSeek-R1满血版 回答完成 深度思考完成 用时27秒,搜索全网29篇资料 以下是详细的PX4固件编译教程,综合多平台及常见问题解决方案: 一、环境准备 系统要求 Ubuntu 20.04/22.04(推荐)或 MacOS 12 Windo…...
23种设计模式-桥接(Bridge)设计模式
桥接设计模式 🚩什么是桥接设计模式?🚩桥接设计模式的特点🚩桥接设计模式的结构🚩桥接设计模式的优缺点🚩桥接设计模式的Java实现🚩代码总结🚩总结 🚩什么是桥接设计模式…...
【黑皮书】 AVL树
目录 前言 一 AVL树的介绍 二 单旋转 二 双旋转 总结 前言 AVL树的学习 一 AVL树的介绍 AVL树是带有平衡条件的二叉查找树,这个平衡条件要持续保持,而且必须保证树的深度为O(log(N))最简单的想法就是要求左右子树具有相同的高度 一棵AVL树是…...
【机器学习】什么是决策树?
什么是决策树? 决策树是一种用于分类和回归问题的模型。它通过一系列的“决策”将数据逐步分裂,最终得出预测结果。可以把它看作是一个“树”,每个节点表示一个特征的判断,而每个分支代表了可能的判断结果,最终的叶子…...
【商城实战(74)】数据采集与整理,夯实电商运营基石
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
使用独立服务器的最佳方式指南
在寻找合适的主机服务方案时,可以考虑独立服务器,因为它拥有管理员权限以及更高的性能配置。在本指南中,我们将介绍独立服务器的多种用途,并分析为什么选择独立服务器可能是处理高性能、资源密集型应用和大流量网站的最佳方案。 搭…...
视频格式转换:畅享多平台无缝视频体验
视频格式转换:畅享多平台无缝视频体验 视频已成为我们日常生活中不可或缺的一部分,不论是工作中展示方案的演示,还是生活里记录美好瞬间的短片,视频的存在无处不在。然而,面对各类设备、平台对视频格式的不同要求&…...
【HTML 基础教程】HTML 属性
HTML 属性 属性是 HTML 元素提供的附加信息。 属性通常出现在 HTML 标签的开始标签中,用于定义元素的行为、样式、内容或其他特性。 属性总是以 name"value" 的形式写在标签内,name 是属性的名称,value 是属性的值。 HTML 属性 …...
爬虫问题整理(2025.3.27)
此时此刻,困扰我一天的两个问题终于得到了解决,在此分享给大家。 问题1:使用anaconda prompt无法进行pip安装,这里只是一个示例,实际安装任何模块都会出现类似报错。 解决办法:关掉梯子......没错…...
短信验证码安全需求设计
背景: 近期发现部分系统再短信充值频繁,发现存在恶意消耗短信额度现象,数据库表排查,发现大量非合法用户非法调用短信接口API导致额度耗尽。由于系统当初设计存在安全缺陷,故被不法分子进行利用,造成损失。…...
若依专题——基础应用篇
若依搭建 搭建后端项目 ① Git 克隆并初始化项目 ② MySQL 导入与配置 ③ 启动 Redis 搭建后端项目注意事项? ① 项目初始化慢,执行clean、package ② MySQL导入后,修改application-druid.yml ③ Redis有密码,修改ap…...
给AI装“记忆U盘“:LangChain记忆持久化入门指南
🧠 什么是记忆持久化? 想象AI对话就像和朋友聊天: 普通模式:每次重启都忘记之前聊过什么持久化模式:给AI配了个"记忆U盘",聊天记录永不丢失 核心组件三件套 #mermaid-svg-ORm8cbBXsaRy2sZ…...
