目录
1. 字母异位词分组 🌟🌟
2. 删除链表的倒数第 N 个结点 🌟🌟
3. 合并区间 🌟🌟
🌟 每日一练刷题专栏 🌟
Golang每日一练 专栏
Python每日一练 专栏
C/C++每日一练 专栏
Java每日一练 专栏
1. 字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入:[eat", "tea", "tan", "ate", "nat", "bat"] 输出:[[ate","eat","tea"],["nat","tan"],["bat"]]
说明:
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
出处:
https://edu.csdn.net/practice/24612383
代码:
方法一:对每个字符串排序后作为key,将同一key的字符串放入同一个ArrayList中,最后返回所有ArrayList。
方法二:使用计数器的方式,统计每个字符出现的次数,将计数器中的数字拼接成一个字符串作为key,将同一key的字符串放入同一个ArrayList中,最后返回所有ArrayList。
import java.util.*;
public class groupAnagrams {public static List<List<String>> groupAnagrams(String[] strs) {HashMap<String, ArrayList<String>> map = new HashMap<>();for (String str : strs) {char[] cs = str.toCharArray();Arrays.sort(cs);String key = String.valueOf(cs);if (!map.containsKey(key)) {map.put(key, new ArrayList<>());}map.get(key).add(str);}return new ArrayList<>(map.values());}public static List<List<String>> groupAnagrams2(String[] strs) {if (strs.length <= 0) {return new ArrayList<>();}HashMap<String, ArrayList<String>> map = new HashMap<>();for (String str : strs) {char[] cs = str.toCharArray();int[] count = new int[26];for (char c : cs) {++count[c - 'a'];}StringBuilder s = new StringBuilder("");for (int num : count) {s.append(num);}String key = String.valueOf(s);if (!map.containsKey(key)) {map.put(key, new ArrayList<>());}map.get(key).add(str);}return new ArrayList<>(map.values());}public static void main(String[] args) {String[] words = {"eat", "tea", "tan", "ate", "nat", "bat"};for (List<String> word : groupAnagrams(words)) {System.out.print(word);System.out.print("");}System.out.println();for (List<String> word : groupAnagrams2(words)) {System.out.print(word);System.out.print("");}System.out.println();}
}
输出:
[eat, tea, ate][bat][tan, nat]
[bat][tan, nat][eat, tea, ate]
2. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
示例 1:
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1 输出:[]
示例 3:
输入:head = [1,2], n = 1 输出:[1]
提示:
- 链表中结点的数目为
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
出处:
https://edu.csdn.net/practice/24612384
代码:
import java.util.*;
public class removeNthFromEnd {public static class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) {this.val = val;}ListNode(int val, ListNode next) {this.val = val;this.next = next;}}public static class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode v = new ListNode(0, head);ListNode handle = v;List<ListNode> index = new ArrayList<>();while (v != null) {index.add(v);v = v.next;}int pre = index.size() - n - 1;int next = index.size() - n + 1;index.get(pre).next = next >= 0 && next < index.size() ? index.get(next) : null;return handle.next;}}public static ListNode[] arraysToLists(int[][] nums) {ListNode[] lists = new ListNode[nums.length];for (int i = 0; i < nums.length; i++) {int[] arr = nums[i];ListNode head = new ListNode(0);ListNode cur = head;for (int num : arr) {cur.next = new ListNode(num);cur = cur.next;}lists[i] = head.next;}return lists;}public static void traverseList(ListNode head) {ListNode cur = head;int count = 0;while (cur != null) {count++;cur = cur.next;}System.out.print("[");for (cur = head; cur != null;) {System.out.print(cur.val);count--;if (count>0) {System.out.print(",");}cur = cur.next;}System.out.println("]");}public static void main(String[] args) {Solution s = new Solution();int[][] lists = {{1,2,3,4,5},{1},{1,2}};int[] n = {2,1,1}; //对应链表的倒数n值ListNode[] heads = arraysToLists(lists);List<ListNode> res = new ArrayList<>();for (int i = 0; i < n.length; i++) {res.add(s.removeNthFromEnd(heads[i], n[i]));traverseList(res.get(i));}}
}
输出:
[1,2,3,5]
[]
[1]
3. 合并区间
以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]] 输出:[[1,6],[8,10],[15,18]] 解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]] 输出:[[1,5]] 解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
提示:
1 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= starti <= endi <= 10^4
出处:
https://edu.csdn.net/practice/24612385
代码:
import java.util.*;
public class mergeIntervals {public static class Solution {public int[][] merge(int[][] intervals) {List<int[]> res = new ArrayList<>();if (intervals == null) {return res.toArray(new int[0][]);}Arrays.sort(intervals, (a, b) -> a[0] - b[0]);int i = 0;int left = 0;int right = 0;while (i < intervals.length) {left = intervals[i][0];right = intervals[i][1];while (i < intervals.length - 1 && right >= intervals[i + 1][0]) {i++;right = Math.max(right, intervals[i][1]);}res.add(new int[] { left, right });i++;}return res.toArray(new int[0][]);}}public static void PrintArrays(int[][] arr) {System.out.print("[");for (int i = 0; i < arr.length; i++) {System.out.print("[");for (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j]);if (j < arr[i].length - 1) {System.out.print(",");}}System.out.print("]");if (i < arr.length - 1) {System.out.print(",");}}System.out.println("]");}public static void main(String[] args) {Solution s = new Solution(); int[][] intervals = {{1,3},{2,6},{8,10},{15,18}};PrintArrays(s.merge(intervals));int[][] intervals2 = {{1,4},{4,5}};PrintArrays(s.merge(intervals2));}
}
输出:
[[1,6],[8,10],[15,18]]
[[1,5]]
🌟 每日一练刷题专栏 🌟
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
☸ 主页:https://hannyang.blog.csdn.net/
Golang每日一练 专栏 | |
Python每日一练 专栏 | |
C/C++每日一练 专栏 | |
Java每日一练 专栏 |