CSDN每日一题学习训练——Java版(对给定的两个日期之间的日期进行遍历、子集 II、填充每个节点的下一个右侧节点指针)

版本说明

当前版本号[20231107]。

版本修改说明
20231107初版

目录

文章目录

  • 版本说明
  • 目录
  • 对给定的两个日期之间的日期进行遍历
    • 题目
    • 解题思路
    • 代码思路
    • 参考代码
  • 子集 II
    • 题目
    • 解题思路
    • 代码思路
    • 参考代码
  • 填充每个节点的下一个右侧节点指针
    • 题目
    • 解题思路
    • 代码思路
    • 参考代码

对给定的两个日期之间的日期进行遍历

题目

​ 对给定的两个日期之间的日期进行遍历,比如startTime 是 2014-07-11;endTime 是 2014-08-11 如何把他们之间的日期获取并遍历出来。

解题思路

  1. 首先,我们需要将给定的两个日期字符串转换为Date对象。可以使用SimpleDateFormat类来实现这个功能。
  2. 然后,我们需要创建一个循环来遍历这两个日期之间的所有日期。我们可以使用一个while循环,每次迭代时将当前日期加一天,直到达到结束日期。
  3. 在循环中,我们可以打印出当前日期,或者将其添加到一个列表中以便后续处理。

代码思路

  1. 定义一个名为SplitTime的公共类。

  2. 在SplitTime类中定义一个静态方法dateSplit,该方法接受两个参数:startDate和endDate,返回一个Date类型的列表

        private static List<Date> dateSplit(Date startDate, Date endDate) throws Exception {…… }
    
  3. dateSplit方法中,首先判断startDate是否在endDate之前,如果不是,就不符合题意了,则抛出异常。

     // 判断开始时间是否在结束时间之后,如果不是则抛出异常if (!startDate.before(endDate))throw new Exception("开始时间应该在结束时间之后");
    
  4. 计算startDate和endDate之间的时间差(以毫秒为单位),并将其除以一天的毫秒数(24 * 60 * 60 * 1000)得到步长step。

    // 计算两个日期之间的毫秒数差值Long spi = endDate.getTime() - startDate.getTime();// 计算需要分割的天数Long step = spi / (24 * 60 * 60 * 1000);
    
  5. 创建一个空的Date类型的列表dateList。

         // 创建一个空的日期列表List<Date> dateList = new ArrayList<Date>();
    
  6. endDate添加到dateList中。

       // 将结束日期添加到列表中dateList.add(endDate);
    
  7. 使用for循环进行输出每一天的日期,从1到step,每次循环都将上一个日期减去一天的毫秒数,然后将结果添加到dateList中。

     // 循环分割日期,并将分割后的日期添加到列表中for (int i = 1; i <= step; i++) {dateList.add(new Date(dateList.get(i - 1).getTime() - (24 * 60 * 60 * 1000)));}
    
  8. 返回dateList。

       // 返回分割后的日期列表return dateList;
    
  9. 在main方法中,创建一个SimpleDateFormat对象sdf,用于解析和格式化日期

     // 创建一个日期格式化对象SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    
  10. 使用sdf解析开始日期和结束日期,得到start和end。

      // 解析开始日期和结束日期Date start = sdf.parse("2015-4-20");Date end = sdf.parse("2015-5-2");
    
  11. 调用dateSplit方法,传入start和end,得到分割后的日期列表lists。

      // 调用dateSplit方法,获取分割后的日期列表List<Date> lists = dateSplit(start, end);
    
  12. 如果lists不为空,则遍历lists,打印每个日期。

     // 判断列表是否为空,如果不为空则遍历并打印每个日期if (!lists.isEmpty()) {for (Date date : lists) {System.out.println(sdf.format(date));}}
    
  13. 如果在执行过程中发生异常,捕获并忽略。

catch (Exception e) {}

参考代码

​ 这段代码首先将给定的日期字符串转换为Date对象,然后使用Calendar类来遍历这两个日期之间的所有日期。在循环中,我们打印出当前日期,并将其添加到一个列表中以便后续处理。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class SplitTime {private static List<Date> dateSplit(Date startDate, Date endDate) throws Exception {if (!startDate.before(endDate))throw new Exception("开始时间应该在结束时间之后");Long spi = endDate.getTime() - startDate.getTime();Long step = spi / (24 * 60 * 60 * 1000);List<Date> dateList = new ArrayList<Date>();dateList.add(endDate);for (int i = 1; i <= step; i++) {dateList.add(new Date(dateList.get(i - 1).getTime() - (24 * 60 * 60 * 1000)));}return dateList;}public static void main(String[] args) throws ParseException {try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date start = sdf.parse("2015-4-20");Date end = sdf.parse("2015-5-2");List<Date> lists = dateSplit(start, end);if (!lists.isEmpty()) {for (Date date : lists) {System.out.println(sdf.format(date));}}} catch (Exception e) {}}
}

子集 II

题目

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

示例 1:

输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]

示例 2:

输入:nums = [0]
输出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10

解题思路

  1. 首先,我们需要创建一个空的结果列表,用于存储所有可能的子集
  2. 然后,我们使用一个循环来遍历整数数组中的每个元素。对于每个元素,我们可以将其添加到当前子集中,并将其添加到结果列表中。
  3. 在添加元素到当前子集时,我们需要确保不重复添加相同的元素。为了实现这一点,我们可以使用一个集合来存储当前子集中的元素。每次添加元素之前,我们可以检查该元素是否已经在集合中存在。如果存在,则跳过该元素;否则,将其添加到集合和当前子集中。
  4. 在循环结束后,我们将当前子集添加到结果列表中。
  5. 最后,返回结果列表作为最终的解集。

代码思路

  1. 创建一个空的结果列表retList。

            // 创建一个空的结果列表List<List<Integer>> retList = new ArrayList<>();// 添加一个空的子集到结果列表中retList.add(new ArrayList<>());
    
  2. 如果输入数组为空或长度为0,则直接返回结果列表。

     // 如果输入数组为空或长度为0,则直接返回结果列表if (nums == null || nums.length == 0)return retList;
    
  3. 对输入数组进行排序。

            // 对输入数组进行排序Arrays.sort(nums);
    
  4. 创建一个临时列表tmp,用于存储当前正在处理的元素。将第一个元素添加到临时列表中,并将临时列表添加到结果列表中。

    	// 创建一个临时列表,用于存储当前正在处理的元素List<Integer> tmp = new ArrayList<>();// 将第一个元素添加到临时列表中tmp.add(nums[0]);// 将临时列表添加到结果列表中retList.add(tmp);
    
  5. 如果输入数组只有一个元素,则直接返回结果列表。

            // 如果输入数组只有一个元素,则直接返回结果列表if (nums.length == 1)return retList;
    
  6. 初始化变量lastLen,表示上一个子集的长度。

            // 初始化变量 lastLen,表示上一个子集的长度int lastLen = 1;
    
  7. 遍历输入数组中的每个元素(从第二个元素开始)。

    // 遍历输入数组中的每个元素(从第二个元素开始)for (int i = 1; i < nums.length; i++)
    
  8. 获取当前结果列表的大小。

      // 获取当前结果列表的大小int size = retList.size();
    
  9. 如果当前元素与前一个元素不同,则更新lastLen的值。

                // 如果当前元素与前一个元素不同,则更新 lastLen 的值if (nums[i] != nums[i - 1]) {lastLen = size;}
    
  10. 遍历当前结果列表中从lastLen开始的所有子集。

       // 遍历当前结果列表中从 lastLen 开始的所有子集for (int j = size - lastLen; j < size; j++)
    
  11. 创建一个新的子集,并将当前元素添加到该子集中。

          // 创建一个新的子集,并将当前元素添加到该子集中List<Integer> inner = new ArrayList(retList.get(j));inner.add(nums[i]);
    
  12. 将新子集添加到结果列表中。

          // 将新子集添加到结果列表中retList.add(inner);
    
  13. 返回结果列表。

   // 返回结果列表return retList;

参考代码

​ 这段代码是一个Java类,名为Solution。它包含一个名为subsetsWithDup的方法,该方法接受一个整数数组nums作为输入,并返回一个列表,其中包含所有可能的子集(不包含重复)。

class Solution {public List<List<Integer>> subsetsWithDup(int[] nums) {List<List<Integer>> retList = new ArrayList<>();retList.add(new ArrayList<>());if (nums == null || nums.length == 0)return retList;Arrays.sort(nums);List<Integer> tmp = new ArrayList<>();tmp.add(nums[0]);retList.add(tmp);if (nums.length == 1)return retList;int lastLen = 1;for (int i = 1; i < nums.length; i++) {int size = retList.size();if (nums[i] != nums[i - 1]) {lastLen = size;}for (int j = size - lastLen; j < size; j++) {List<Integer> inner = new ArrayList(retList.get(j));inner.add(nums[i]);retList.add(inner);}}return retList;}
}

填充每个节点的下一个右侧节点指针

题目

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {
int val;
Node *left;
Node *right;
Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。

进阶:

你只能使用常量级额外空间。
使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

image-20231107200815034

示例:

输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,‘#’ 标志着每一层的结束。

提示:

树中节点的数量少于 4096
-1000 <= node.val <= 1000

解题思路

  1. 首先,我们需要填充完美二叉树的每个节点的next指针,使其指向其右侧的节点。如果当前节点是该层的最后一个节点,则其next指针应设置为NULL
  2. 对于完美二叉树,我们可以使用层次遍历的方法来解决这个问题。具体来说,我们可以使用一个队列来存储每一层的节点。然后,我们从根节点开始,依次处理每一层的节点。对于每一层,我们将当前节点的next指针指向其右侧的节点(如果存在的话)。然后,我们将当前节点的左右子节点添加到队列中,以便在下一轮中处理。
  3. 在处理完一层的所有节点后,我们需要将队列中的节点清空,以便开始处理下一层的节点。
  4. 最后,当队列为空时,说明我们已经处理完了所有的节点,此时返回根节点即可。

代码思路

  1. 定义一个Node类,表示二叉树的节点,包含四个属性:val表示节点的值,left表示左子节点,right表示右子节点,next表示下一个节点。

    class Node {public int val; // 节点的值public Node left; // 左子节点public Node right; // 右子节点public Node next; // 下一个节点
    };
    
  2. 同时定义了三个构造函数,分别用于初始化节点的值、左右子节点和下一个节点

    // 默认构造函数public Node() {}// 带一个参数的构造函数,用于初始化节点的值public Node(int _val) {val = _val;}// 带四个参数的构造函数,用于初始化节点的值、左右子节点和下一个节点public Node(int _val, Node _left, Node _right, Node _next) {val = _val;left = _left;right = _right;next = _next;}
    
  3. 定义一个Solution类,包含一个connect方法,用于连接二叉树中的节点

    // 定义一个Solution类,包含一个connect方法,用于连接二叉树中的节点
    class Solution {public Node connect(Node root)
    
  4. 首先判断根节点是否为空,如果为空则直接返回。

     // 如果根节点为空,直接返回if (root == null)return root;
    
  5. 然后判断根节点的左子节点是否不为空,如果不为空则将左子节点的next指针指向右子节点

     // 如果根节点的左子节点不为空,将左子节点的next指针指向右子节点if (root.left != null)root.left.next = root.right;
    
  6. 接着判断根节点的右子节点和下一个节点是否都不为空,如果不都为空则将右子节点的next指针指向下一个节点的左子节点

    // 如果根节点的右子节点和下一个节点都不为空,将右子节点的next指针指向下一个节点的左子节点if (root.next != null && root.right != null) {root.right.next = root.next.left;}
    
  7. 最后递归地连接左子树和右子树的节点。

     // 递归地连接左子树和右子树的节点connect(root.left);connect(root.right);
    
  8. 返回连接后的根节点。

  // 返回连接后的根节点return root;

参考代码

这段代码的思路是实现一个二叉树的层次遍历,并将同一层的节点通过next指针连接起来。

class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, Node _left, Node _right, Node _next) {val = _val;left = _left;right = _right;next = _next;}
};
class Solution {public Node connect(Node root) {if (root == null)return root;if (root.left != null)root.left.next = root.right;if (root.next != null && root.right != null) {root.right.next = root.next.left;}connect(root.left);connect(root.right);return root;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/184655.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络工程师回顾学习(第二部分)

第六章&#xff1a;网络互连与互联网 需要掌握&#xff1a; &#xff08;1&#xff09;网络互连设备 &#xff08;2&#xff09;网络互连的基本原理和关键技术 &#xff08;扩展&#xff1a;TCP/IP协议簇&#xff09; &#xff08;3&#xff09;Internet协议及其提供的网络…

Linux/centos上如何配置管理Web服务器?

Linux/centos上如何配置管理Web服务器&#xff1f; 1 Web简单了解2 关于Apache3 如何安装Apache服务器&#xff1f;3.1 Apache服务安装3.2 httpd服务的基本操作 4 如何配置Apache服务器&#xff1f;4.1 关于httpd.conf配置4.2 常用指令 5 简单实例 1 Web简单了解 Web服务器称为…

大数据学习之一文学会Spark【Spark知识点总结】

文章目录 什么是SparkSpark的特点Spark vs HadoopSparkHadoopSpark集群安装部署Spark集群安装部署StandaloneON YARN Spark的工作原理什么是RDDRDD的特点Spark架构相关进程Spark架构原理 Spark实战&#xff1a;单词统计Scala代码开发java代码开发任务提交 Transformation与Acti…

机器学习模板代码(期末考试复习)自用存档

机器学习复习代码 利用sklearn实现knn import numpy as np import pandas as pd from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import GridSearchCVdef model_selection(x_train, y_train):## 第一个是网格搜索## p是选择查找方式:1是欧…

【CSP认证考试】202309-1:坐标变换(其一)100分解题思路+代码

解题思路 暴力解决&#xff0c;不考虑时空开销就一直用for循环也可以做出来。按照题目意思输入两个数组&#xff0c;然后将第一个输入的数组的x部分累加起来记作x&#xff0c;再将y部分累加起来记作y。再将第二个数组的x部分都加上x&#xff0c;y部分加上y。最后输出第二个数组…

【分布式事务】初步探索分布式事务的概率和理论,初识分布式事的解决方案 Seata,TC 服务的部署以及微服务集成 Seata

文章目录 一、分布式服务案例1.1 分布式服务 demo1.2 演示分布式事务问题 二、分布式事务的概念和理论2.1 什么是分布式事务2.2 CAP 定理2.3 BASE 理论2.4 分布式事务模型 三、分布式事务解决方案 —— Seata3.1 什么是 Seata3.2 Seata 的架构3.3 Seata 的四种分布式事务解决方…

2023中国视频云市场报告:腾讯云音视频解决方案份额连续六次蝉联榜首,加速全球化布局

近日&#xff0c;国际数据公司&#xff08;IDC&#xff09;发布了《中国视频云市场跟踪&#xff08;2023上半年&#xff09;》报告&#xff0c;腾讯云音视频的解决方案份额连续六次蝉联榜首&#xff0c;并在视频生产创作与媒资管理市场份额中排名第一。同时&#xff0c;在实时音…

深入理解 Django 模板系统

概要 在任何 Web 开发过程中&#xff0c;渲染和展示数据是不可或缺的一部分。Django 作为一个高效的 Python Web 框架&#xff0c;提供了一个强大且灵活的模板系统。本文将详细介绍 Django 模板系统的核心概念、语法和高级功能。 一、Django 模板系统简介 Django 的模板系统允…

Android修行手册 - 模板匹配函数matchTemplate详解,从N张图片中找到是否包含五星

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

Qt OpenGL相机系统

文章目录 一、简介二、实现代码三、实现效果参考资料效果展示 一、简介 一直偷懒没有学习OpenGL,乘着这段有点时间重新学习一下OpenGL,做一个简单的小工具,有助于后面理解OSG。我们都知道OpenGL中存在着下面几个坐标空间:模型空间(物体空间)、世界空间、观察空间(或者称…

五、计算机网络

&#xff08;一&#xff09;OSI/RM 七层模型 七层模型是计算机网络的基石&#xff0c;整个计算机网络是构建与七层模型之上的。 在数据链路层&#xff0c;数据开始以帧为单位&#xff0c;网卡的 MAC 地址就是数据帧的地址&#xff0c;数据的传输开始有地址了。 局域网是工作…

JavaWeb Day05 前后端请求响应与分层解耦

目录 一、请求与响应 &#xff08;一&#xff09;请求的参数接收 ①数组参数 ②集合参数 ③日期参数 ④json参数 ⑤路径参数 总结 &#xff08;二&#xff09;响应 ①简单文本text ②数组 ③列表 ④同一响应数据格式 ⑤总结 二、三层架构与分层解耦 &#xff0…

昇腾CANN 7.0 黑科技:大模型推理部署技术解密

CANN作为最接近昇腾AI系列硬件产品的一层&#xff0c;通过软硬件联合设计&#xff0c;打造出适合昇腾AI处理器的软件架构&#xff0c;充分使能和释放昇腾硬件的澎湃算力。针对大模型推理场景&#xff0c;CANN最新发布的CANN 7.0版本有机整合各内部组件&#xff0c;支持大模型的…

Vue路由介绍及使用

一、单页应用程序介绍 1.概念 单页应用程序&#xff1a;SPA【Single Page Application】是指所有的功能都在一个html页面上实现&#xff0c;当切换不同的功能时&#xff0c;页面不会进行刷新&#xff0c;类似Ajax请求&#xff0c;但请求地址会发生部分变化。 2.具体示例 单…

深度学习环境搭建入门环境搭建(pytorch版本)

从Python安装到深度学习环境搭建 1. Anaconda安装 python可以通过官网下载exe&#xff0c;这里提供的是使用anaconda创建多个虚拟 的python环境&#xff0c;使用Anaconda Prompt管理虚拟环境更方便。 官网地址&#xff1a;Free Download|Anaconda 下载到本地后双击此文…

WPF中数据绑定验证深入讲解

WPF中数据绑定验证深入讲解 WPF在用户输入时&#xff0c;提供了验证功能&#xff0c;通常验证使用以下两种方式来实现&#xff1a; 在数据对象中引发错误。通常是在属性设置过程中抛出异常&#xff0c;或者在数据类中实现INotifyDataErrorInfo或IDataErrorInfo接口。在绑定级…

技术分享 | 测试平台开发-前端开发之数据展示与分析

测试平台的数据展示与分析&#xff0c;我们主要使用开源工具ECharts来进行数据的展示与分析。 ECharts简介与安装 ECharts是一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表&#xff…

Appium —— 初识移动APP自动化测试框架Appium

说到移动APP自动化测试&#xff0c;代表性的测试框架非Appium莫属&#xff0c;从今天开始我们将从APP结构解析、Appium框架学习、安卓/iOS自动化测试实战、自动遍历回归测试、自动化测试平台及持续集成&#xff0c;多个维度一起由浅入深的学废Appium 今天我们先来初步认识Appi…

C++中将数据添加到文件的末尾

参考:https://blog.csdn.net/qq_23880193/article/details/44279283 C中文件的读取需要包含fstream文件&#xff0c;即&#xff1a;#include 文件的读取和写入是是通过流操作来的&#xff0c;这不像输入、输出流那样&#xff0c;库中已经定义了对象cin和cout 文件的读取需要声…

加速度jsudo:小企业会遇到哪些瓶颈期?

什么是瓶颈期&#xff1f;瓶颈期&#xff0c;就是你无论怎么努力&#xff0c;成绩都是上不去&#xff0c;还是停留在原地&#xff1b;而自己表现的还是很匆忙&#xff0c;却不知道如何下手&#xff1f;就像水桶效益一样&#xff0c;水桶的木板高度层次不齐&#xff0c;像极了自…