Java每日一练(20230403)

news/2024/11/23 23:35:44/

目录

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每日一练 专栏


http://www.ppmy.cn/news/37407.html

相关文章

第13章_约束

第13章_约束 &#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在某公司…

C++语言基础——函数(详解)

目录 函数是什么 函数的定义 主函数举例 空函数 函数的调用 语法格式 举例说明&#xff1a;计算x的n次方 递归 递归的主要点 递归的结构 条件 递归使用的场景 函数是什么 函数全名叫计算机函数&#xff0c;它可以帮助你完成一些特定的程序。你可以把它简单理解成一把…

03.时间和空间复杂度

1. 算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xff0c;而空间效率被称作 空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度&#xff0c;而空间复杂度主要衡量一个算法所需要的额外空间&am…

《SpringBoot》第03章 自动配置机制(二) 根注解@SpringBootApplication

前言 之前介绍到了把启动类封装成BeanDefinition注入进IOC容器&#xff0c;那么这个启动类就会跟普通的bean一样在refresh()中被实例化&#xff0c;那么显而易见作为启动类这个实例化并不简单&#xff0c;肯定会存在一些特殊处理&#xff0c;那么就需要研究一下其注解SpringBo…

QT Qwidget 事件处理机制

qlineEdit Qt事件处理是指在Qt应用程序中处理各种事件的过程。事件是指在应用程序中发生的各种操作&#xff0c;例如按键、鼠标点击、窗口移动等。Qt提供了一个事件处理机制&#xff0c;使得开发者可以对这些事件进行处理&#xff0c;以实现应用程序的各种功能。 Qt中的事件处…

面试官问我为什么Integer a = (128) != Integer b (128) 装箱拆箱及IntegerCache问题

前言 基本数据类型与包装类型&#xff1a; 什么是基本数据类型&#xff1f;什么是包装类型&#xff1f; 装箱拆箱 什么是装箱&#xff1f;什么是拆箱&#xff1f; 怎么进行装箱的&#xff1f; 为什么这样设计&#xff1f; 如何进行拆箱 有了基本数据类型为什么还要有包…

【计算机视觉 | 目标检测】DETR风格的目标检测框架解读

文章目录一、前言二、理解2.1 DETR的理解2.2 DETR的细致理解2.2.1 Backbone2.2.2 Transformer encoder2.2.3 Transformer decoder2.2.4 Prediction feed-forward networks (FFNs)2.2.5 Auxiliary decoding losses2.3 更具体的结构2.4 编码器的原理和作用2.5 解码器的原理和作用…

【前端】jQuery

jQuery 是 JavaScript 的一个库&#xff0c;可以简化 JavaScript 编程 点击下载 jQuery 语法 $(selector).action()jquery(selector).action() selector 为选择器&#xff0c;使用选择器选择 HTML 元素 action() 为操作&#xff0c;对选中的元素进行操作 选择器 CSS 选择…