当前位置: 首页 > 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.dtcms.com/a/341020.html

相关文章:

  • RHCA07-Linux跟踪工具及CPU调优
  • Linux I/O 多路复用实战:深入剖析 Select 与 Poll
  • capsh 命令详解
  • 【机器学习深度学习】Ollama、vLLM、LMDeploy对比:选择适合你的 LLM 推理框架
  • Objective-C 版本的 LiveEventBus 效果
  • vue+openlayers示例:适配arcgis矢量瓦片服务以及样式(附源码下载)
  • 英伟达Blackwell架构下的中国特供版AI芯片:B30A与RTX 6000D,是技术妥协还是市场新策略?
  • 基于单片机太阳能充电器/太阳能转换电能
  • C端高并发项目都有哪些
  • Angular由一个bug说起之十八:伴随框架升级而升级ESLint遇到的问题与思考
  • C++围绕音视频相关的资料都有哪些?如何进行学习
  • 实现自己的AI视频监控系统-第一章-视频拉流与解码2
  • 【ansible】4.实施任务控制
  • 【沉浸式解决问题】peewee.ImproperlyConfigured: MySQL driver not installed!
  • 亚马逊运营破局:销量与ACOS的动态平衡之道
  • 网页作品惊艳亮相!这个浪浪山小妖怪网站太治愈了!
  • 8 月中 汇报下近半个月都在做些什么
  • VR交通安全学习机-VR交通普法体验馆方案
  • Vue3源码reactivity响应式篇之数组代理的方法
  • Android studio gradle 下载不下来
  • 23种设计模式——模板方法模式(Template Method Pattern)详解
  • 在 Ubuntu Linux LTS 上安装 SimpleScreenRecorder 以录制屏幕
  • 软考中级习题与解答——第一章_数据结构与算法基础(1)
  • 软考网工选择题节选-2
  • uniapp:h5链接拉起支付宝支付
  • uni-app跨端开发最后一公里:详解应用上架各大应用商店全流程
  • 从协同设计到绿色制造:工业云渲染的价值闭环
  • uniapp 手写签名组件开发全攻略
  • 三极管单电源供电中电阻关系的理解
  • Oracle:创建触发器,当目标表相关字段有数据变动时,存入临时表