当前位置: 首页 > news >正文

哈希:字母异位词分组

问题描述

分组整理字符串数组中的异位词,同组的放一起,返回所有的分组。

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

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

说明:由相同字母组成的字符串,互为异位词。


求解思路:哈希

对字符串排序,互为异位词的字符串排序之后一定相同。从这个角度出发,就可以把排序之后的字符串作为key,异位词作为value。以上示例处理成这样:

keyvalue
abtbat
antnat,tan
aetate,eat,tea
class Solution {public List<List<String>> groupAnagrams(String[] strs) {HashMap<String, List<String>> hashMap = new HashMap<>();for (String s : strs) {// 先将字符串转为字符数组,然后对是字符数组进行排序char[] charArr = s.toCharArray();Arrays.sort(charArr);// 通过new String的构造方式,使用char数组构造字符串String strKey = new String(charArr);// 使用getOrDefault方法,处理value为空的情况List<String> list = hashMap.getOrDefault(strKey, new ArrayList<>());list.add(s);hashMap.put(strKey, list);}// 构造返回参数// 方法一:遍历hashMap// List<List<String>> result = new ArrayList<List<String>>();// for(Map.Entry<String,List<String>> entry : hashMap.entrySet()){//     result.add(entry.getValue());// }// return result;// 方法二:直接调用hashMap的values()方法return new ArrayList<List<String>>(hashMap.values());}
}

常用操作回顾

1、遍历hashMap的六种方法

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;public class PrintMap {public static void main(String[] args) {HashMap<String, Integer> map = new HashMap<>();map.put("Lucy", 18);map.put("Jack", 20);map.put("Layla", 22);// 方法一:通过entrySet()方法for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());}// 方式二:使用values方法;只能访问值for (Integer value : map.values()) {System.out.println("value" + value);}// 方式三:使用keySet方法;只能访问键for (String key : map.keySet()) {System.out.println("key:" + key);}// 方式四:使用forEach();java8以上map.forEach((key, value) -> System.out.println("key:" + key + ",value:" + value));// 方式五:使用迭代器Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();while (iterator.hasNext()) {Map.Entry<String, Integer> entry = iterator.next();System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());}// 方式六:使用java Stream API;Java8以上map.entrySet().stream().forEach(entry -> System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue()));}
}

2、构造字符串的七种方法

1. 使用双引号直接创建字符串
String str = "Hello, World!";
2. 使用new关键字
String str = new String("Hello, World!");
3. 使用String.format()方法
String name = "World";
String greeting = String.format("Hello, %s!", name); // 输出: Hello, World!
4. 使用+操作符连接字符串
String firstName = "John";
String lastName = "Doe";
String fullName = firstName + " " + lastName; 
// 输出: John Doe
5. 使用StringBuilder或StringBuffer类(推荐用于大量字符串操作)

对于需要频繁修改字符串的情况(例如,构建一个长的或复杂的字符串)。
使用StringBuilder或StringBuffer会更有效率。
StringBuilder在单线程环境下效率更高,而StringBuffer是线程安全的。

StringBuilder sb = new StringBuilder();
sb.append("Hello, ");
sb.append("World!");
String result = sb.toString(); 
// 输出: Hello, World!
6. 使用String.join()方法(适用于多个字符串的连接)

当需要将多个字符串通过特定的分隔符连接起来时,可以使用String.join()方法。

String[] parts = {"Hello", "World"};
String message = String.join(", ", parts); 
// 输出: Hello, World
7. 使用String.valueOf()方法(转换其他类型为字符串)

如果你需要将其他类型(如整数、浮点数等)转换为字符串,可以使用String.valueOf()方法。

int number = 123;
String numberStr = String.valueOf(number); // 输出: "123"

3、字符串数组的四种排序

方法一:数组使用Arrays.sort()
import java.util.Arrays;public class Main {public static void main(String[] args) {String[] strings = {"banana", "apple", "orange", "mango"};Arrays.sort(strings);System.out.println(Arrays.toString(strings));}
}
方法二:List使用Collections.sort()(对于List<String>
import java.util.Arrays;
import java.util.Collections;
import java.util.List;public class Main {public static void main(String[] args) {List<String> strings = Arrays.asList("banana", "apple", "orange", "mango");Collections.sort(strings);System.out.println(strings);}
}
方法三:使用自定义比较器

例如:按字符串长度排序

import java.util.Arrays;
import java.util.Comparator;public class Main {public static void main(String[] args) {String[] strings = {"banana", "apple", "orange", "mango"};Arrays.sort(strings, new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return Integer.compare(s1.length(), s2.length()); // 按字符串长度排序}});System.out.println(Arrays.toString(strings)); // 按长度排序后的数组}
}

Lambda表达式简化:

Arrays.sort(strings, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
方法四:利用Stream API进行排序
import java.util.Arrays;
import java.util.stream.Collectors;public class Main {public static void main(String[] args) {String[] strings = {"banana", "apple", "orange", "mango"};String[] sortedStrings = Arrays.stream(strings).sorted() // 默认按字典顺序排序字符串数组元素.toArray(String[]::new); // 收集回数组中System.out.println(Arrays.toString(sortedStrings)); // 输出排序后的数组内容}
}

http://www.lryc.cn/news/626716.html

相关文章:

  • Linux系统:C语言进程间通信信号(Signal)
  • 动态规划----6.单词拆分
  • Java 大视界 -- Java 大数据在智能医疗远程会诊数据管理与协同诊断优化中的应用(402)
  • C++---向下取整(>>)与向零取整(/)
  • WPF Alert弹框控件 - 完全使用指南
  • 【力扣 买卖股票的最佳时机 Java/Python】
  • 【Unity3D优化】平衡 Hide 与 Destroy:基于性能等级与 LRU 的 UI 管理策略与实践思考
  • 大数据毕业设计选题推荐-基于Hadoop的电信客服数据处理与分析系统-Spark-HDFS-Pandas
  • 计算机网络模型
  • 华为数通认证学习
  • CSS 定位的核心属性:position
  • SPSS数据文件的建立与管理
  • JAVA中向量数据库(Milvus)怎么配合大模型使用
  • 案例分享:BRAV-7123助力家用型人形机器人,智能生活未来已来
  • vscode连接docker
  • Linux 文本处理与 Shell 编程笔记:正则表达式、sed、awk 与变量脚本
  • React-native之组件
  • 51单片机-驱动LED点阵模块教程
  • Gitee仓库 日常操作详细步骤
  • 【笔记】动手学Ollama 第五章 Ollama 在 LangChain 中的使用 - Python 集成
  • 康师傅2025上半年销售收入减少超11亿元,但净利润增长20.5%
  • Linux《进程间通信(下)》
  • LidaReferv1论文细节解读
  • Linux面试经典题目(七)
  • 在SQL中使用大模型时间预测模型TimesFM
  • 不会写 SQL 也能出报表?积木报表 + AI 30 秒自动生成报表和图表
  • sqlalchemy 是怎么进行sql表结构管理的,怎么进行数据处理的
  • 深度学习核心技巧
  • SQL-leetcode— 2356. 每位教师所教授的科目种类的数量
  • Kafka如何保证「消息不丢失」,「顺序传输」,「不重复消费」,以及为什么会发送重平衡(reblanace)