大厂算法面试 7 天冲刺:第 1 天 - 深度剖析数组与字符串高频算法(Java 实战)

第1天:数组与字符串算法实战(Java 实现)

1. 典型问题分析

问题1:两数之和(Two Sum)

题目描述

给定一个整数数组 nums 和一个目标值 target,请你在数组中找出 和为目标值 的那 两个整数,并返回它们的数组下标。

示例
输入: nums = [2,7,11,15], target = 9
输出: [0,1]
解释: 因为 nums[0] + nums[1] = 2 + 7 = 9

2. 解决方案(多种方式)

方法1:暴力枚举(O(n²))

思路

  • 使用两层 for 循环遍历数组的所有可能的数对,检查它们的和是否等于 target
public int[] twoSumBruteForce(int[] nums, int target) {for (int i = 0; i < nums.length; i++) {for (int j = i + 1; j < nums.length; j++) {if (nums[i] + nums[j] == target) {return new int[]{i, j};}}}return new int[]{}; // 没有找到返回空数组
}

缺点:时间复杂度 O(n²),适用于小规模数据。


方法2:哈希表优化(O(n))

思路

  • 使用 HashMap 存储遍历过的数字和它们的索引。
  • 遍历数组时,计算 target - nums[i] 是否已在 HashMap 中,如果存在,则直接返回两个索引。
import java.util.HashMap;
import java.util.Map;public int[] twoSumHashMap(int[] nums, int target) {Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums.length; i++) {int complement = target - nums[i];if (map.containsKey(complement)) {return new int[]{map.get(complement), i};}map.put(nums[i], i);}return new int[]{};
}

优点

  • 通过 HashMap 进行 O(1) 查询,时间复杂度 O(n),适用于大规模数据。
  • 空间复杂度为 O(n),因为 HashMap 需要额外存储元素。

问题2:最长无重复子串(Longest Substring Without Repeating Characters)

题目描述

给定一个字符串 s,请你找出其中 不含重复字符的最长子串 的长度。

示例
输入: s = "abcabcbb"
输出: 3
解释: 最长不重复子串是 "abc",长度为3

2. 解决方案(多种方式)

方法1:暴力枚举(O(n²))

思路

  • 逐个遍历子串,检查是否有重复字符,更新最长长度。
public int lengthOfLongestSubstringBruteForce(String s) {int maxLength = 0;for (int i = 0; i < s.length(); i++) {for (int j = i; j < s.length(); j++) {if (hasDuplicate(s, i, j)) break;maxLength = Math.max(maxLength, j - i + 1);}}return maxLength;
}private boolean hasDuplicate(String s, int start, int end) {Set<Character> set = new HashSet<>();for (int i = start; i <= end; i++) {if (set.contains(s.charAt(i))) return true;set.add(s.charAt(i));}return false;
}

缺点:时间复杂度 O(n²),适用于小规模字符串。


方法2:滑动窗口(O(n))

思路

  • 使用 双指针(left, right)HashSet 记录窗口内字符。
  • 移动右指针 扩展窗口,如果出现重复字符,则 移动左指针 缩小窗口,直到没有重复字符。
import java.util.HashSet;
import java.util.Set;public int lengthOfLongestSubstring(String s) {Set<Character> set = new HashSet<>();int maxLength = 0, left = 0;for (int right = 0; right < s.length(); right++) {while (set.contains(s.charAt(right))) {set.remove(s.charAt(left));left++;}set.add(s.charAt(right));maxLength = Math.max(maxLength, right - left + 1);}return maxLength;
}

优点

  • 时间复杂度 O(n),比暴力解法更高效。
  • 适用于 大规模字符串处理

问题3:最大子数组和(Kadane’s Algorithm)

题目描述

给定一个整数数组 nums,找到 连续子数组(最少包含一个元素),使其和最大,并返回最大和。

示例
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6

2. 解决方案

方法1:暴力枚举(O(n²))

思路

  • 计算所有可能的子数组和,找出最大值。
public int maxSubArrayBruteForce(int[] nums) {int maxSum = Integer.MIN_VALUE;for (int i = 0; i < nums.length; i++) {int sum = 0;for (int j = i; j < nums.length; j++) {sum += nums[j];maxSum = Math.max(maxSum, sum);}}return maxSum;
}

缺点:时间复杂度 O(n²),适用于小规模数据。


方法2:Kadane’s Algorithm(O(n))

思路

  • 动态规划思想dp[i] 代表 以 nums[i] 结尾的最大子数组和
  • 递推公式:
    • dp[i] = max(dp[i-1] + nums[i], nums[i])
    • 只需维护 currentSum 变量,优化为 O(1) 空间
public int maxSubArray(int[] nums) {int maxSum = nums[0], currentSum = nums[0];for (int i = 1; i < nums.length; i++) {currentSum = Math.max(currentSum + nums[i], nums[i]);maxSum = Math.max(maxSum, currentSum);}return maxSum;
}

优点

  • 线性时间 O(n),适用于 大规模数据
  • 适用于 金融、信号处理等领域

总结

  • 两数之和:HashMap 优化查询 O(n)
  • 最长无重复子串:滑动窗口 O(n)
  • 最大子数组和:Kadane’s Algorithm O(n)

🔥 掌握这些算法,快速提升算法面试能力! 🚀

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

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

相关文章

敏捷测试(Agile Testing)

敏捷测试&#xff08;Agile Testing&#xff09; 敏捷测试是在敏捷开发&#xff08;Agile Development&#xff09;环境下进行的软件测试方法&#xff0c;强调快速反馈、持续测试、团队协作&#xff0c;以确保软件质量贯穿整个开发周期。与传统瀑布模型不同&#xff0c;敏捷测…

FreeRTOS内核实现与应用学习之6——多优先级

在FreeRTOS中&#xff0c;数字优先级越小&#xff0c;逻辑优先级也越小&#xff1b;在任务创建时&#xff0c;会根据任务的优先级将任务插入就绪列表不同的位置。 相同优先级的任务插入就绪列表中的同一条链表中。 要想任务支持优先级&#xff0c;即只要实现在任务切换&#xf…

【C++篇】C++入门基础(二)

&#x1f4ac; 欢迎讨论&#xff1a;在阅读过程中有任何疑问&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;如果你觉得这篇文章对你有帮助&#xff0c;记得点赞、收藏&#xff0c;并分享给更多对C感兴趣的…

Mysql架构之日志讲解:redo log,undo log,bin log 日志

一、buffer pool缓冲区 讲日志之前&#xff0c;我们要先认识一下buffer pool缓冲区。 mysql想完成数据的修改&#xff0c;会先从存储引擎层读取数据&#xff0c;把数据读取到服务层进行数据的修改&#xff0c;再通过存储引擎层把数据更新到数据库中。 mysql每次读取数据都会…

容器主机CPU使用率突增问题一则

关键词 LINUX、文件系统crontab 、mlocate根目录使用率 There are many things that can not be broken&#xff01; 如果觉得本文对你有帮助&#xff0c;欢迎点赞、收藏、评论&#xff01; 一、问题现象 业务一台容器服务器&#xff0c;近期经常收到cpu不定期抖动告警&#x…

simpleITK - Setup - matplotlib‘s imshow

使用 matplotlib 显示内联图像 在此笔记本中&#xff0c;我们将探索使用 matplotlib 显示笔记本中的图像&#xff0c;并致力于开发可重复使用的函数来显示 SimpleITK 图像的 2D、3D、颜色和标签叠加层。 我们还将研究使用需要输入图像重叠的图像过滤器的微妙之处。 %matplot…

Github 热点项目 awesome-mcp-servers MCP 服务器合集,3分钟实现AI模型自由操控万物!

【今日推荐】超强AI工具库"awesome-mcp-servers"星数破万&#xff01; ① 百宝箱式服务模块&#xff1a;AI能直接操作浏览器、读文件、连数据库&#xff0c;比如让AI助手自动整理Excel表格&#xff0c;三分钟搞定全天报表&#xff1b; ② 跨领域实战利器&#xff1a;…

硬件老化测试方案的设计误区

硬件老化测试方案设计中的常见误区主要包括测试周期不足、测试条件过于单一、样品选择不当等方面。其中&#xff0c;测试周期不足尤为突出&#xff0c;容易导致潜在缺陷未被完全暴露。老化测试本质上是通过加速产品老化来模拟长期使用状况&#xff0c;因此测试周期不足会严重削…

CSS学习笔记5——渐变属性+盒子模型阶段案例

目录 通俗易懂的解释 渐变的类型 1、线性渐变 渐变过程 2、径向渐变 如何理解CSS的径向渐变&#xff0c;以及其渐变属性 通俗易懂的解释 渐变属性 1. 形状&#xff08;Shape&#xff09; 2. 大小&#xff08;Size&#xff09; 3. 颜色停靠点&#xff08;Color Sto…

Java StringUtils工具类常用方法详解

StringUtils是Apache Commons Lang库中一个极其常用的工具类&#xff0c;它提供了大量处理字符串的静态方法&#xff0c;能够简化我们的日常开发工作&#xff0c;提高代码的可读性和健壮性。下面我将详细介绍StringUtils类中最常用的方法及其使用场景。 一、StringUtils的基本…

设计模式(创建型)- 原型模式

目录 定义 类图 角色 优缺点 优点 缺点 应用场景 案例展示 浅克隆 深克隆 定义 原型模式旨在创建重复的对象&#xff0c;同时确保良好的性能表现。它通过复制现有对象&#xff08;原型&#xff09;来创建新对象&#xff0c;而非使用传统的构造函数创建方式。这种设计…

MQ的数据一致性,如何保证?

1 数据一致性问题的原因 这些年在Kafka、RabbitMQ、RocketMQ踩过的坑&#xff0c;总结成四类致命原因&#xff1a; 生产者悲剧&#xff1a;消息成功进Broker&#xff0c;却没写入磁盘就断电。消费者悲剧&#xff1a;消息消费成功&#xff0c;但业务执行失败。轮盘赌局&#x…

Angular由一个bug说起之十五:自定义基于Overlay的Tooltip

背景 工具提示&#xff08;tooltip&#xff09;是一个常见的 UI 组件&#xff0c;用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本&#xff0c;所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…

简单介绍一下Unity中的ScriptableObject

ScriptableObject的本质 ScriptableObject是Unity引擎中的一个特殊基类&#xff0c;允许你创建不依附于游戏对象的数据容器&#xff0c;以资产(Asset)形式存储在项目中。这些资产&#xff1a; 可在编辑器中创建和配置 在构建后作为资产打包 可通过Resources或AssetBundle加…

ubuntu24.04.2 NVIDIA GeForce RTX 4060笔记本安装驱动

https://www.nvidia.cn/drivers/details/242281/ 上面是下载地址 sudo chmod x NVIDIA-Linux-x86_64-570.133.07.run # 赋予执行权限把下载的驱动复制到家目录下&#xff0c;基本工具准备&#xff0c;如下 sudo apt update sudo apt install build-essential libglvnd-dev …

LabVIEW 布尔控件回车键触发程序退出

在 LabVIEW 开发过程中&#xff0c;部分用户可能会遇到按下回车键&#xff08;Enter&#xff09;后&#xff0c;程序意外退出的问题。该问题主要源于布尔控件的属性设置冲突&#xff0c;包括键分配、数据绑定及 Tab 键行为等。本文将详细分析问题根源&#xff0c;并提供一套完整…

分布式系统面试总结:3、分布式锁(和本地锁的区别、特点、常见实现方案)

仅供自学回顾使用&#xff0c;请支持javaGuide原版书籍。 本篇文章涉及到的分布式锁&#xff0c;在本人其他文章中也有涉及。 《JUC&#xff1a;三、两阶段终止模式、死锁的jconsole检测、乐观锁&#xff08;版本号机制CAS实现&#xff09;悲观锁》&#xff1a;https://blog.…

WebWorkers在项目中的使用案例

Worker | 文档 worker 线程的关闭在主线程和 worker 线程都能进行操作&#xff0c;但对 worker 线程的影响略有不同。 // main.js&#xff08;主线程&#xff09; const myWorker new Worker(/worker.js); // 创建worker myWorker.terminate(); // 关闭worker 复制代码 // wor…

vue ts+Windi CSS

1、创建vue项目 trae&#xff08;字节&#xff09;打开一个空文件夹 npm install -g vue/cli vue create my-project cd my-project vue add typescript npm run serve vue项目创建完成 2、安装windicss vue add windicss vue.config.js配置 npm install vue-router …

【HTML 基础教程】HTML 编辑器

HTML 编辑器推荐 可以使用专业的 HTML 编辑器来编辑 HTML&#xff0c;菜鸟教程为大家推荐几款常用的编辑器&#xff1a; VS Code&#xff1a;Visual Studio Code - Code Editing. RedefinedSublime Text&#xff1a;http://www.sublimetext.com/在线编辑器&#xff1a;HTML/C…