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

news2024/11/23 2:26:50

版本说明

当前版本号[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.coloradmin.cn/o/1181824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机组成】实模式/保护模式下地址分段(基段地址+偏移地址)的原因

一.硬编码/静态重定向 我们先来观察下没有地址分段时代CPU是怎么和内存们打交道&#xff0c;在8086CPU以前的老大哥们&#xff0c;访问内存时通常就是实打实的“指哪打哪”&#xff0c;程序指定要放在哪个地址&#xff0c;那就老老实实地放在哪个地址&#xff0c;比如程序A要放…

如何使新手小白编码能力暴涨之Devchat-AI

在这个快速发展的时代&#xff0c;开发者的任务越来越繁重&#xff0c;要求他们快速、高效地完成开发任务。然而&#xff0c;传统的开发方式已经无法满足这个需求。在这种情况下&#xff0c;Devchat的出现给开发者带来了新的帮助。Devchat是一个研发效能分析平台&#xff0c;它…

掌握未来技术趋势:深度学习与量子计算的融合

掌握未来技术趋势&#xff1a;深度学习与量子计算的融合 摘要&#xff1a;本博客将探讨深度学习与量子计算融合的未来趋势&#xff0c;分析这两大技术领域结合带来的潜力和挑战。通过具体案例和技术细节&#xff0c;我们将一睹这两大技术在人工智能、药物研发和金融科技等领域…

【Node.js入门之—1.1Node.js 简介】

Node.js入门之—1.1Node.js 简介 文章目录 Node.js入门之—1.1Node.js 简介什么是 Node.js错误说法 Node.js 的特点跨平台三方类库自带http服务器非阻塞I/O事件驱动单线程 Node.js 的应用场合适合用Node.js的场合不适合用Node.js的场合弥补Node.js不足的解决方案 什么是 Node.j…

Oracle RAC是啥?

Oracle RAC&#xff0c;全称是Oracle Real Application Cluster&#xff0c;翻译过来为Oracle真正的应用集群&#xff0c;它是Oracle提供的一个并行集群系统&#xff0c;由 Oracle Clusterware&#xff08;集群就绪软件&#xff09; 和 Real Application Cluster&#xff08;RA…

Linux之如何使用git提交代码到gitee上

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、创建gitee仓库1、进入gitee2、注册账号3、创建仓库 二、使用Linux创建1、打开Xshell创建一…

SpringBoot工程四种创建方式

创建SpringBoot项目时选择依赖&#xff1a;Spring Web、MySQL Driver、Thymeleaf、lombok 开发控制器类&#xff1a;标记了Controller的类就是一个handler类 handler类在SpringBoot中的作用就是&#xff1a;其内部的方法可以接受请求&#xff0c;处理请求&#xff0c;返回响应…

Intel oneAPI笔记(4)--jupyter官方文档(Unified Shared Memory)学习笔记

前言 本文是对jupyterlab中oneAPI_Essentials/03_Unified_Shared_Memory文档的学习记录&#xff0c;主要包含对统一共享内存的讲解 USM概述 USM (Unified Shared Memory)是SYCL中基于指针的内存管理。对于使用malloc或new来分配数据的C和C程序员来说应该很熟悉。当将现有的C…

如何定义类

类是将数据和方法封装在一起的一种数据结构&#xff0c;其中数据表示类的属性&#xff0c;方法表示类的行为&#xff0c;所以定义类实际上就是定义类的属性与方法。用户定义一个类实际上就是定义一个新的数据类型。在使用类之前&#xff0c;必须先定义它&#xff0c;然后才可利…

【JavaEE初阶】 UDP协议的详细解析

文章目录 &#x1f332;UDP协议概念&#x1f334;UDP协议端格式&#x1f384;UDP的特点&#x1f6a9;无连接&#x1f6a9;不可靠传输&#x1f6a9;面向数据报&#x1f6a9;缓冲区&#x1f6a9;全双工&#x1f6a9;大小受限 &#x1f340;基于UDP的应用层协议&#x1f38d;扩展问…

Linux安装nodejs问题

安装nodejs后&#xff0c;使用node -v报下图 参考下面两个可解决&#xff1a;【Linux-编译器gcc/glibc升级】CentOS7.9使用NodeJS18时报错/lib64/libm.so.6: version GLIBC_2.27‘ not found-CSDN博客 报错信息ImportError: /lib64/libstdc.so.6: version CXXABI_1.3.9‘ not f…

JavaScript使用对象

对象(object)是最基本、最通用的类型&#xff0c;具有复合性结构&#xff0c;属于引用型数据&#xff0c;对象的结构具有弹性&#xff0c;内部的数据是无序的&#xff0c;每个成员被称为属性。在JavaScript中&#xff0c;对象是一个泛化的概念&#xff0c;任何值都可以转换为对…

FreeRTOS源码阅读笔记2--list.c

list.c中主要完成列表数据结构的操作&#xff0c;有列表和列表项的初始化、列表的插入和移除。 2.1列表初始化vListInitialise() 2.1.1函数原型 void vListInitialise( List_t * const pxList ) pxList&#xff1a;列表指针&#xff0c;指向要初始化的列表。 2.1.2函数框架…

viple进阶2:打印九九乘法表

&#xff08;1&#xff09;题目 题目&#xff1a;使用viple打印九九乘法表 &#xff08;2&#xff09;设计与实现 观察效果图&#xff0c;发现&#xff1a; 1、第1行&#xff0c;有1个公式&#xff1b;第2行有2个公式&#xff1b;第3行有3个公式&#xff0c;以此类推&#x…

Texlive安装

下载4.8G的iso文件 解压 或 装载后&#xff0c;以管理员身份运行(.bat)文件。 运行以下两句代码进行Texlive相关升级 tlmgr option repository otan tlmgr update --self --all 运行以下三行代码&#xff0c;检查是否安装成功 latex -v xelatex -v pdflatex -v 如果有异常…

基于协作搜索算法的无人机航迹规划-附代码

基于协作搜索算法的无人机航迹规划 文章目录 基于协作搜索算法的无人机航迹规划1.协作搜索搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用协作搜索算法来优化无人机航迹规划。 …

思谋科技进博首秀:工业多模态大模型IndustryGPT V1.0正式发布

大模型技术正在引领新一轮工业革命&#xff0c;但将其应用于工业制造&#xff0c;仍面临许多挑战&#xff0c;专业知识的缺乏是关键难点。11月5日&#xff0c;香港中文大学终身教授、思谋科技创始人兼董事长贾佳亚受邀参加第六届中国国际进口博览会暨虹桥国际经济论坛开幕式。虹…

技术分享 | app自动化测试(Android)--显式等待机制

WebDriverWait类解析 WebDriverWait 用法代码 Python 版本 WebDriverWait( driver,timeout,poll_frequency0.5,ignored_exceptionsNone) 参数解析&#xff1a; driver&#xff1a;WebDriver 实例对象 timeout: 最长等待时间&#xff0c;单位秒 poll_frequency: 检测的间…

技术分享 | Appium 用例录制

下载及安装 下载地址&#xff1a; github.com/appium/appi… 下载对应系统的 Appium 版本&#xff0c;安装完成之后&#xff0c;点击 “Start Server”&#xff0c;就启动了 Appium Server。 在启动成功页面点击右上角的放大镜&#xff0c;进入到创建 Session 页面。配置好…

nginx-配置拆分(各个模块详细说明)

主配置文件 配置结构 ... #nginx全局块events { #events块... #events块 }http { #http块... #http全局块server { #server块... #server全局块location [PATTERN] { #location块... #location块}location [PATTERN] {...}}serv…