文章目录
- T1 两数之和
- T49 字母异位词分组
- 常用小技巧
T1 两数之和
链接:1. 两数之和
题目:
【刷题感悟】这道题用两层for循环也能做出来,但我们还是要挑战一下时间复杂度小于 O ( n 2 ) O(n^2) O(n2)的解法,不能因为它是第一道 而且还是简单题就不做,题目还是常做常新的,从中挖掘新的学习点也是一个一件很有价值的事情。
代码:
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> indexValueMap = new HashMap<>();
for (int ii = 0; ii < nums.length; ii++) {
// 把数值作为key,下标作为value好一点,因为value比key方便获取而且题目最终是希望我们返回数组下标
if (indexValueMap.containsKey(target - nums[ii])) {
// 初始化数组的方法
return new int[] {ii, indexValueMap.get(target - nums[ii])};
}
indexValueMap.put(nums[ii], ii);
}
// 返回一个空数组
return new int[] {};
}
T49 字母异位词分组
链接:49. 字母异位词分组
题目:
代码:
public List<List<String>> groupAnagrams(String[] strs) {
// 1. Map<String, String> -> Map<单词字典序, 单词>
// 博客:将一个字符串转成字典序排列的字符串(有点想复杂了)
// Step1: 收集异位词
Map<String, List<String>> map = new HashMap<>();
for (String str : strs) {
String sortedString = getSortedString(str);
if (map.containsKey(sortedString)) {
List<String> wordList = map.get(sortedString);
wordList.add(str);
map.put(sortedString, wordList);
continue;
}
// 初始化数组的方法
map.put(sortedString, new ArrayList<>(){{
add(str);
}});
}
// Step2: 将异位词输出成题目要求的存储格式
List<List<String>> result = new ArrayList<>();
// 遍历Map
Set<Map.Entry<String, List<String>>> wordEntrySet = map.entrySet();
wordEntrySet.forEach(entrySet -> result.add(entrySet.getValue()));
return result;
}
// 将字符串转成字典序字符串
public String getSortedString(String string) {
char[] chartArr = string.toCharArray();
Arrays.sort(chartArr); // 按字典序排列
return String.valueOf(chartArr); // char数组转成字符串
}
常用小技巧
初始化数组的方法
new int[] {1, 2};
初始化List的方法
new ArrayList<>(){{ // 两层括号
add(str);
}};
将字符串转换成它的字典序字符串
char[] chartArr = string.toCharArray(); // 先把字符串转成char数组
Arrays.sort(chartArr); // 按字典序排列
return String.valueOf(chartArr); // char数组转成字符串
遍历map
// 1. 先把map的entrySet赋值给一个Set
Set<Map.Entry<String, List<String>>> wordEntrySet = map.entrySet();
// 2. 再用Lambda表达式遍历set
wordEntrySet.forEach(entrySet -> result.add(entrySet.getValue()));