剑指 Offer II 033. 变位词组
该题解法是hash+sort,答案是评论区大佬写的。
/*
大体思路:创建一个哈希表
再将每个字符串变成字符数组 排序后若哈希表里不存在排序后的字符串,则创建索引,
然后将原字符串放进对应索引的数组里
*/
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//创建一个哈希表
Map<String,List<String>> map = new HashMap<>();
//对于给定的字符数组的每个字符串
for(String str : strs){
//变为字符数组
char[] ch = str.toCharArray();
//将的得到的字符数组排序
Arrays.sort(ch);
//排序后的字符数组变成字符串
String s = new String(ch);
//判断哈希表里是否存在对应的索引
if(!map.containsKey(s)){
map.put(s,new ArrayList<>());
}
//注意:将原字符串存入
map.get(s).add(str);
}
//map.values()->List<String>
return new ArrayList<>(map.values());
}
}
剑指 Offer II 035. 最小时间差
解题思路:排除大小大于 24*60 的情况,设置最大值 然后把时间排序,不断遍历计算两个时间点之间的差值取最小值返回即可。
解法见评论区的大佬:
class Solution {
public int findMinDifference(List<String> timePoints) {
//因为时间精确到分钟,所以时间点只有24*60个
if (timePoints.size() > 24 * 60) {
return 0;
}
//创建用于储存分钟的数组
List<Integer> mins = new ArrayList<>();
for (String t : timePoints) {
//将时间以:分开
String[] time = t.split(":");
//将时间转化为分钟
mins.add(Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]));
}
//用Collecting的sort方法为分钟排序1
Collections.sort(mins);
//将最小值加上一天的分钟数,作为最大值放在最后,用于计算最后一个值和最大值的差值
mins.add(mins.get(0) + 24 * 60);
//初始化我们的结果
int res = 24 * 60;
//计算相邻数的差值,不断用最小值对res进行替换
for (int i = 1; i < mins.size(); ++i) {
res = Math.min(res, mins.get(i) - mins.get(i - 1));
}
//返回结果
return res;
}
}
膜拜大佬