Java每日一练(20230403) 字母异位词分组、删除链表的倒数第 N 个结点、合并区间

简介: Java每日一练(20230403) 字母异位词分组、删除链表的倒数第 N 个结点、合并区间

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/


目录
相关文章
|
2月前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
23 3
|
2月前
|
Java Go PHP
Java分组匹配
Java分组匹配
26 5
|
3月前
|
存储 Java
|
3月前
|
算法 Java
【Java集合类面试十八】、ConcurrentHashMap是怎么分段分组的?
ConcurrentHashMap通过分段锁(Segment)实现高效并发访问,get操作无需加锁,而put操作首先判断是否需要扩容,然后通过两次hash定位并尝试使用CAS和锁机制安全地添加元素。
|
3月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
101 0
|
5月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
5月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
5月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
50 2
|
6月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
53 1