LeetCode -- Flora -- edit 2025-04-16

1.两数之和

1. 两数之和

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

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

示例 1:

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

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

我的

    public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();for(int i=0;i<nums.length;i++){int temp = target - nums[i];if(hashtable!=null && hashtable.containsKey(temp)){return new int[]{hashtable.get(temp),i};}hashtable.put(nums[i],i);}return null;}

别人的

class Solution {public int[] twoSum(int[] nums, int target) {int length = nums.length;for(int i = 0; i < length - 1; i++){int back_i = length - i - 1;for(int j = i + 1; j < length; j++){int back_j = length - j - 1;if(nums[i] + nums[j] == target){return new int[]{i,j};}if(nums[back_i] + nums[back_j] == target){return new int[]{back_i, back_j};}}}return new int[0];}
}

思路不一样:

思路不一样 每次不止比较1对数的和

2.字母异位词分组

49. 字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

我的

class Solution {public static List<List<String>> groupAnagrams(String[] strs) {List<List<String>> resData = new ArrayList<>();for(int i = 0 ; i<strs.length ; i++){String sortedString = sortString(strs[i]);if(resData.size() == 0){List<String> innerList = new LinkedList<>();innerList.add(sortedString);innerList.add(strs[i]);resData.add(innerList);}else{Boolean isOld = false;for(int j = 0 ; j<resData.size(); j++){String existingSortedString = resData.get(j).get(0);if(sortedString.equals(existingSortedString)){List<String> innerList = resData.get(j);innerList.add(strs[i]);resData.set(j,innerList);isOld = true;break;}}if (!isOld){//isNewList<String> innerList = new ArrayList<>();innerList.add(sortedString);innerList.add(strs[i]);resData.add(innerList);}}}for(int j = 0 ; j<resData.size(); j++){List<String> innerList = resData.get(j);innerList.remove(0);resData.set(j,innerList);}// 按内部 List 的 size 升序排序Collections.sort(resData, new Comparator<List<?>>() {@Overridepublic int compare(List<?> list1, List<?> list2) {return Integer.compare(list1.size(), list2.size());}});return resData;}public static String sortString(String input) {// 将字符串转换为字符数组char[] charArray = input.toCharArray();// 对字符数组进行排序Arrays.sort(charArray);// 将排序后的字符数组转换为字符串return new String(charArray);}}

别人的

import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Solution {public List<List<String>> groupAnagrams(String[] strs) {return new AbstractList<List<String>>() {private final List<List<String>> list = new ArrayList<>();public void initList() {if (list.isEmpty()) {Map<String, List<String>> map = new HashMap();for(String s:strs){char[] cc=s.toCharArray();Arrays.sort(cc);String key =Arrays.toString(cc);List<String>list=map.getOrDefault(key, new ArrayList());list.add(s);map.put(key,list);}list.addAll(map.values());}}@Overridepublic List<String> get(int index) {initList();return list.get(index);}@Overridepublic int size() {initList();return list.size();}};}}

 思路一样,实现方式的优化:

确定每个字符串通过同一排序规则得到唯一排序字符串,由此判断是否为由相同字母组成的字符串,加入到同一list
去掉每个内层list的第一位
按内层list的size从小到大排序

0.1.代码总结

    public static void main(String[] args) {// 1int[] nums = {2,7,11,15};int target = 9;int[] twoSum = twoSum2(nums, target);System.out.println(Arrays.toString(twoSum));// 2String[] strs = {"eat","tea","tan","ate","nat","bat"};List<List<String>> groupAnagrams = groupAnagrams2(strs);System.out.println(groupAnagrams);}public static int[] twoSum2(int[] nums, int target) {//思路不一样 每次不止比较1对数的和int length = nums.length;for(int i = 0; i < length - 1; i++){int back_i = length - i - 1;for(int j = i + 1; j < length; j++){int back_j = length - j - 1;if(nums[i] + nums[j] == target){return new int[]{i,j};}if(nums[back_i] + nums[back_j] == target){return new int[]{back_i, back_j};}}}return new int[0];}//2-answerpublic static List<List<String>> groupAnagrams2(String[] strs) {return new AbstractList<List<String>>() {private final List<List<String>> list = new ArrayList<>();public void initList() {if (list.isEmpty()) {Map<String, List<String>> map = new HashMap();for(String s:strs){//1.sort 思路:确定每个字符串通过同一排序规则得到唯一排序字符串char[] cc=s.toCharArray();Arrays.sort(cc);String key = Arrays.toString(cc);//2.addList 由唯一排序字符串判断是否为由相同字母组成的字符串,加入到同一listList<String> list = map.getOrDefault(key, new ArrayList());list.add(s);map.put(key, list);}list.addAll(map.values());}}@Overridepublic List<String> get(int index) {initList();return list.get(index);}@Overridepublic int size() {initList();return list.size();}};}//1-mypublic static int[] twoSum(int[] nums, int target) {Map<Integer, Integer> map = new HashMap<Integer, Integer>();for(int i=0;i<nums.length;i++){int temp = target - nums[i];//思路if(map!=null && map.containsKey(temp)){return new int[]{map.get(temp),i};}map.put(nums[i],i);}return null;}//2-mypublic static List<List<String>> groupAnagrams(String[] strs) {//思路:确定每个字符串通过同一排序规则得到唯一排序字符串,由此判断是否为由相同字母组成的字符串加入到同一list//去掉每个内层list的第一位//按内层list的size从小到大排序List<List<String>> resData = new ArrayList<>();for(int i = 0 ; i<strs.length ; i++){String sortedString = sortString(strs[i]);if(resData.size() == 0){List<String> innerList = new LinkedList<>();innerList.add(sortedString);innerList.add(strs[i]);resData.add(innerList);}else{Boolean isOld = false;for(int j = 0 ; j<resData.size(); j++){String existingSortedString = resData.get(j).get(0);if(sortedString.equals(existingSortedString)){List<String> innerList = resData.get(j);innerList.add(strs[i]);resData.set(j,innerList);isOld = true;break;}}if (!isOld){//isNewList<String> innerList = new ArrayList<>();innerList.add(sortedString);innerList.add(strs[i]);resData.add(innerList);}}}for(int j = 0 ; j<resData.size(); j++){List<String> innerList = resData.get(j);innerList.remove(0);resData.set(j,innerList);}// 按内部 List 的 size 升序排序Collections.sort(resData, new Comparator<List<?>>() {@Overridepublic int compare(List<?> list1, List<?> list2) {return Integer.compare(list1.size(), list2.size());}});return resData;}public static String sortString(String input) {// 将字符串转换为字符数组char[] charArray = input.toCharArray();// 对字符数组进行排序Arrays.sort(charArray);// 将排序后的字符数组转换为字符串return new String(charArray);}

0.2.相关

AI:使用通俗易懂的例子的来讲解AbstractList

看起来用户可能在学习Java集合框架,特别是想深入理解如何自定义List实现。

用户可能已经了解了AbstractList的基本用法,但希望有更简单、生活化的例子来加深理解。他们可能对之前的技术示例感到有些复杂,或者需要更直观的解释来巩固概念。需要将AbstractList的概念与实际生活中的场景结合,帮助用户形成直观印象。

需要确定用户的基础水平。之前的回答涉及到了代码示例,所以用户可能有一定的编程经验,但可能需要更基础的比喻或例子。例如,用日常生活中的事物来类比AbstractList的作用,比如菜单、书架等。

用户的需求不仅仅是知道如何用代码实现,而是理解AbstractList存在的意义和适用场景。可能需要强调为什么使用AbstractList而不是直接实现List接口,比如减少必须实现的方法数量,提供默认实现等。

另外,用户可能想知道在什么情况下应该继承AbstractList,比如需要自定义列表行为,或者包装现有数据结构。需要提供简单明了的例子,比如只读列表、固定大小列表,或者组合多个列表的情况。

需要避免使用过于技术化的术语,转而使用比喻和简单代码示例。例如,用书架的比喻来解释不可变列表,用购物清单来演示可变列表的实现。同时,对比直接实现List接口和继承AbstractList的差异,突出AbstractList的便利性。

还要注意用户可能的误区,比如认为继承AbstractList必须实现所有方法,而实际上只需要实现get和size。或者对于修改操作,默认会抛出异常,需要覆盖set、add等方法才能支持修改。

最后,确保例子涵盖不同的使用场景,如不可变列表、包装现有数组、动态扩展的列表等,帮助用户全面理解AbstractList的灵活性和实用性。

好的!我用一个 「菜单本」 的比喻来帮你理解 AbstractList,并配上一个超简单的代码例子。


📖 比喻场景

假设你要做一个 「饭店菜单系统」,但有个特殊要求:

  • 普通服务员只能 查看 菜单(不能修改)

  • 店长有 修改菜单 的权限

如果用 AbstractList 来实现,就像这样:


🎯 代码实现

import java.util.AbstractList;
import java.util.Arrays;
import java.util.List;// 自定义菜单类(继承AbstractList)
class Menu extends AbstractList<String> {private String[] dishes;  // 存储菜品// 构造方法public Menu(String[] dishes) {this.dishes = Arrays.copyOf(dishes, dishes.length);}// 必须实现的方法1:获取菜品(普通服务员用)@Overridepublic String get(int index) {return dishes[index];}// 必须实现的方法2:获取菜单长度@Overridepublic int size() {return dishes.length;}// 可选实现:修改菜品(只有店长能调用)@Overridepublic String set(int index, String newDish) {String oldDish = dishes[index];dishes[index] = newDish;return oldDish;  // 返回被替换的旧菜名}
}public class Test {public static void main(String[] args) {// 初始菜单String[] initialDishes = {"鱼香肉丝", "宫保鸡丁", "麻婆豆腐"};List<String> menu = new Menu(initialDishes);// 普通服务员查看菜单System.out.println("当前菜单:" + menu);  // 输出:[鱼香肉丝, 宫保鸡丁, 麻婆豆腐]// 尝试修改菜单(会报错,因为没权限)// menu.add("水煮鱼");  // 抛出 UnsupportedOperationException// 店长修改第二道菜if (menu instanceof Menu) {Menu bossMenu = (Menu) menu;String old = bossMenu.set(1, "辣子鸡");System.out.println("替换掉:" + old);  // 输出:替换掉:宫保鸡丁}System.out.println("新菜单:" + menu);  // 输出:[鱼香肉丝, 辣子鸡, 麻婆豆腐]}
}

🔑 关键点解析

  1. 为什么用 AbstractList?

    • 它帮你实现了 List 接口中大部分复杂方法(如 iterator()

    • 你只需专注实现 get() 和 size() 这两个核心方法

  2. 修改控制

    • 默认所有修改方法(如 add()remove())会抛出异常

    • 如果想让某些角色能修改,只需覆盖对应方法(比如例子中的 set()

  3. 实际应用场景

    • 创建 只读列表(不覆盖修改方法)

    • 包装现有数组(如例子中的 String[] dishes

    • 实现特殊规则的列表(如固定长度列表、组合多个列表)


💡 对比直接实现 List 接口

如果不用 AbstractList,你需要实现 List 接口的 24个方法!而用 AbstractList 只需要实现 2个方法,其他方法已有默认实现。

就像做菜单时,有人帮你写好了打印菜单、搜索菜品等功能,你只需告诉它「菜品存在哪」和「有多少道菜」。

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

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

相关文章

web后端语言下篇

#作者&#xff1a;允砸儿 #日期&#xff1a;乙巳青蛇年 三月廿一 笔者今天将web后端语言PHP完结一下&#xff0c;后面还会写一个关于python的番外。 PHP函数 PHP函数它和笔者前面写的js函数有些许类似&#xff0c;都是封装的概念。将实现某一功能的代码块封装到一个结构中…

LeetCode 259 题全解析:Swift 快速找出“满足条件”的三人组

文章目录 摘要描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a; 题解答案&#xff08;Swift&#xff09;题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 本文围绕 LeetCode 259 题“较小的三数之和”&#xff0c;通过 Swift 给出两种解法&#xff0c;并…

第八节:React HooksReact 18+新特性-React Server Components (RSC) 工作原理

• 与SSR区别&#xff1a;零客户端JS、服务端数据直出 • 搭配Next.js 14使用场景 React Server Components (RSC) 工作原理及 Next.js 14 应用场景解析 一、RSC 核心工作原理 React Server Components (RSC) 是 React 18 引入的颠覆性特性&#xff0c;其设计目标是 服务端与…

万字解析TCP

通过学习视频加博客的组合形式&#xff0c;整理了一些关于TCP协议的知识。 *图源&#xff1a;临界~的csdn博客。 一、TCP建立连接 TCP的建立连接&#xff0c;大致可以分为面向连接、TCP报文结构、TCP的三次握手、TCP的建立状态、SYN泛洪攻击。 1.1、面向连接 面向连接 --- …

前端vue+typeScritp+elementPlus基础页面实现:

效果&#xff1a; 前端代码&#xff1a; index.vue: <template><el-container><el-main><el-card class"search-card" shadow"never"><transition :enter-active-class"proxy?.animate.searchAnimate.enter" :le…

微电网与分布式能源:智能配电技术的场景化落地

安科瑞顾强 随着数字化转型与能源革命的加速推进&#xff0c;电力系统正经历从传统模式向智能化、网络化方向的深刻变革。用户侧的智能配电与智能用电技术作为这一变革的核心驱动力&#xff0c;正在重塑电力行业的生态格局。本文将从技术架构、应用场景及未来趋势等维度&#…

绿幕抠图直播软件-蓝松抠图插件--使用相机直播,灯光需要怎么打?

使用SONY相机进行绿幕抠图直播时&#xff0c;灯光布置是关键&#xff0c;直接影响抠图效果和直播画质。以下是详细的灯光方案和注意事项&#xff1a; 一、绿幕灯光布置核心原则 均匀照明&#xff1a;绿幕表面光线需均匀&#xff0c;避免阴影和反光&#xff08;亮度差控制在0.5…

Linux Privilege Escalation: LD_PRELOAD

声明&#xff1a;本文所有操作需在授权环境下进行&#xff0c;严禁非法使用&#xff01; 0x01 什么是 LD_PRELOAD&#xff1f; LD_PRELOAD 是 Linux 系统中一个特殊的环境变量&#xff0c;它允许用户在程序启动时优先加载自定义的动态链接库&#xff08;.so 文件&#xff09;&…

程序性能(1)嵌入式基准测试工具

程序性能(1)嵌入式基准测试工具 Author&#xff1a;Once Day date: 2025年4月19日 漫漫长路&#xff0c;才刚刚开始… 全系列文档查看&#xff1a;Perf性能分析_Once-Day的博客-CSDN博客 参考文档: CPU Benchmark – MCU Benchmark – CoreMark – EEMBC Embedded Micropr…

ArrayList的subList的数据仍是集合

ArrayList的subList结果不可强转成ArrayList&#xff0c;否则会抛出 ClassCastException异常 • 级别&#xff1a; 【CRITICAL】 • 规约类型&#xff1a;BUG • 最坏影响&#xff1a; 程序错误&#xff0c;抛出异常 说明&#xff1a;subList 返回的是ArrayList的内部类SubL…

Notepad++中将文档格式从Windows(CR LF)转换为Unix(LF)

在Windows中用记事本写了一个.sh的Linux运行脚本&#xff0c;是无法直接在Linux中执行&#xff0c;需要首先把文本编码格式转换为Unix的&#xff0c;特别是换行符这些&#xff0c;转换步骤如下&#xff1a; 1、打开文档 在Notepad中打开需要转换的文件。 2、进入文档格式转换…

使用Ingress发布应用程序

使用Ingress发布应用程序 文章目录 使用Ingress发布应用程序[toc]一、什么是Ingress二、定义Ingress三、什么是Ingress控制器四、部署nginx Ingress控制器1.了解nginx Ingress控制器的部署方式2.安装nginx Ingress控制器3.本地实际测试 五、使用Ingress对外发布应用程序1.使用D…

【网络编程】TCP数据流套接字编程

目录 一. TCP API 二. TCP回显服务器-客户端 1. 服务器 2. 客户端 3. 服务端-客户端工作流程 4. 服务器优化 TCP数据流套接字编程是一种基于有连接协议的网络通信方式 一. TCP API 在TCP编程中&#xff0c;主要使用两个核心类ServerSocket 和 Socket ServerSocket Ser…

力扣刷题Day 21:两数之和(1)

1.题目描述 2.思路 暴力解法虽然不超时间限制&#xff0c;但是题解实在太妙了&#xff0c;哈希大法好&#xff01; 3.代码&#xff08;Python3&#xff09; class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:hash_table dict()for i, num i…

关于UE5的抗锯齿和TAA

关于闪烁和不稳定现象的详细解释 当您关闭抗锯齿技术时&#xff0c;场景中会出现严重的闪烁和不稳定现象&#xff0c;尤其在有细节纹理和小物体的场景中。这种现象的技术原因如下&#xff1a; 像素采样问题 在3D渲染中&#xff0c;每个像素只能表示一个颜色值&#xff0c;但…

【MySQL】MySQL建立索引不知道注意什么?

基本原则&#xff1a; 1.选择性原则&#xff1a; 选择高选择性的列建立索引(该列有大量不同的值) 2.适度原则&#xff1a;不是越多越好&#xff0c;每个索引都会增加写入开销 列选择注意事项&#xff1a; 1.常用查询条件列&#xff1a;WHERE字句中频繁使用的列 2.连接操作列…

Vue3 + TypeScript中provide和inject的用法示例

基础写法&#xff08;类型安全&#xff09; typescript // parent.component.vue import { provide, ref } from vue import type { InjectionKey } from vue// 1. 定义类型化的 InjectionKey const COUNTER_KEY Symbol() as InjectionKey<number> const USER_KEY Sy…

树莓派超全系列教程文档--(33)树莓派启动选项

树莓派启动选项 启动选项start_file &#xff0c;fixup_filecmdlinekernelarm_64bitramfsfileramfsaddrinitramfsauto_initramfsdisable_poe_fandisable_splashenable_uartforce_eeprom_reados_prefixotg_mode &#xff08;仅限Raspberry Pi 4&#xff09;overlay_prefix配置属…

java怎么找bug?Arthas原理与实战指南

Arthas原理与实战指南 1. Arthas简介 Arthas是阿里巴巴开源的Java诊断工具&#xff0c;其名字取自《魔兽世界》的人物阿尔萨斯。它面向线上问题定位&#xff0c;被广泛应用于性能分析、定位问题、安全审计等场景。Arthas的核心价值在于它能够在不修改应用代码、不重启Java进程…

Python自学第1天:变量,打印,类型转化

突然想学Python了。经过Deepseek的推荐&#xff0c;下载了一个Python3.12安装。安装过程请自行搜索。 乖乖从最基础的学起来&#xff0c;废话不说了&#xff0c;上链接&#xff0c;呃&#xff0c;打错了&#xff0c;上知识点。 变量的定义 # 定义一个整数类型的变量 age 10#…