当前位置: 首页 > news >正文

LeetCode2409——统计共同度过的日子数

在这里插入图片描述


博主的解法过于冗长,是一直对着不同的案例debug修改出来的,不建议学习。虽然提交成功了,但是自己最后都不知道写的是啥了哈哈哈。
在这里插入图片描述
在这里插入图片描述

package keepcoding.leetcode.leetcode2409;
/*Alice 和 Bob 计划分别去罗马开会。给你四个字符串 arriveAlice ,leaveAlice ,arriveBob 和 leaveBob 。Alice 会在日期 arriveAlice 到 leaveAlice 之间在城市里(日期为闭区间),而 Bob 在日期 arriveBob 到 leaveBob 之间在城市里(日期为闭区间)。每个字符串都包含 5 个字符,格式为 "MM-DD" ,对应着一个日期的月和日。请你返回 Alice和 Bob 同时在罗马的天数。你可以假设所有日期都在 同一个 自然年,而且 不是 闰年。每个月份的天数分别为:[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]*/
public class Result01 {public static void main(String[] args) {int days = countDaysTogether("08-12","08-26","08-26","10-25");System.out.println(days);}/*输入:arriveAlice = "08-15", leaveAlice = "08-18",arriveBob = "08-16", leaveBob = "08-19"输出:3解释:Alice 从 8 月 15 号到 8 月 18 号在罗马。Bob 从 8 月 16 号到 8 月 19 号在罗马,他们同时在罗马的日期为 8 月 16、17 和 18 号。所以答案为 3 。*/public static int countDaysTogether(String arriveAlice, String leaveAlice, String arriveBob, String leaveBob) {String[] arriveAliceTimeArray = arriveAlice.split("-",2);String[] leaveAliceTimeArray = leaveAlice.split("-",2);String[] arriveBobTimeArray = arriveBob.split("-",2);String[] leaveBobTimeArray = leaveBob.split("-",2);int aliceArriveMonth = Integer.valueOf(arriveAliceTimeArray[0]);int aliceLeaveMonth = Integer.valueOf(leaveAliceTimeArray[0]);int aliceArriveDay = Integer.valueOf(arriveAliceTimeArray[1]);int aliceLeaveDay = Integer.valueOf(leaveAliceTimeArray[1]);int bobArriveMonth = Integer.valueOf(arriveBobTimeArray[0]);int bobLeaveMonth = Integer.valueOf(leaveBobTimeArray[0]);int bobArriveDay = Integer.valueOf(arriveBobTimeArray[1]);int bobLeaveDay = Integer.valueOf(leaveBobTimeArray[1]);if (aliceArriveDay==bobArriveDay && aliceArriveMonth==bobArriveMonth && aliceLeaveDay==bobLeaveDay && aliceLeaveMonth==bobLeaveMonth){if (aliceArriveDay==1 && aliceLeaveMonth==12){return 365;}else if (aliceArriveDay==28 && aliceArriveMonth==2 && aliceLeaveMonth==3){return 2;}}//alice和bob同一个月到if (aliceArriveMonth == bobArriveMonth) {//同一个月走if (aliceLeaveMonth==bobLeaveMonth){if (aliceArriveDay > bobLeaveDay || bobArriveDay > aliceLeaveDay) {//alice/bob到的时候 bob/alice已经走了 共同度过的日子为0return 0;} else {//alice先到if (aliceArriveDay <= bobArriveDay) {return aliceLeaveDay <= bobLeaveDay ? (aliceLeaveDay-bobArriveDay)+1 : (bobLeaveDay-bobArriveDay)+1;//alice后到} else {return aliceLeaveDay <= bobLeaveDay ? (aliceLeaveDay-aliceArriveDay)+1 : (bobLeaveDay-aliceArriveDay)+1;}}//alice走的月份小于bob 即alice先走}else if (aliceLeaveMonth<bobLeaveMonth){if (aliceLeaveDay==bobArriveDay){return 1;}else {int sumDays = aliceLeaveDay;for (int i = aliceArriveMonth+1; i < aliceLeaveMonth; i++) {sumDays += getMonthDays(i);}sumDays += aliceArriveDay>=bobArriveDay ? getMonthDays(aliceArriveMonth)-aliceArriveDay : getMonthDays(bobArriveMonth)-bobArriveDay;return sumDays+1;}//alice走的月份大于bob 即bob先走}else {int sumDays = 0;if (bobArriveMonth==bobLeaveMonth){sumDays += bobLeaveDay - bobArriveDay;}else {sumDays = bobLeaveDay;for (int i = bobArriveMonth+1; i <bobLeaveMonth ; i++) {sumDays += getMonthDays(i);}sumDays += aliceArriveDay>=bobArriveDay ? getMonthDays(aliceArriveMonth)-aliceArriveDay : getMonthDays(bobArriveMonth)-bobArriveDay;}return sumDays+1;}//alice月份先到} else if (aliceArriveMonth < bobArriveMonth) {if (aliceLeaveMonth < bobArriveMonth) {//alice在bob到之前就走了return 0;//alice 走 的那个月 bob 到} else if (aliceLeaveMonth == bobArriveMonth) {if(aliceLeaveDay<=bobLeaveDay){return bobArriveDay < aliceLeaveDay ? (aliceLeaveDay-bobArriveDay)+1 : 0;}else {return bobArriveDay < aliceLeaveDay ? (bobLeaveDay-bobArriveDay)+1 : 0;}//alice在bob到的月份之后的月份才走} else {//bob走的月份小于aliceif (bobLeaveMonth < aliceLeaveMonth) {int sumDays = getMonthDays(bobArriveMonth) - bobArriveDay;for (int i = bobArriveMonth + 1; i < bobLeaveMonth; i++) {sumDays += getMonthDays(i);}sumDays += bobLeaveDay;return sumDays+1;//bob走的月份大于alice} else if (bobLeaveMonth > aliceLeaveMonth) {int sumDays = getMonthDays(bobArriveMonth) - bobArriveDay;for (int i = bobArriveMonth + 1; i < aliceLeaveMonth; i++) {sumDays += getMonthDays(i);}sumDays += aliceLeaveDay;return sumDays+1;//bob跟alice一个月走}else {int sumDays = getMonthDays(bobArriveMonth) - bobArriveDay;for (int i = bobArriveMonth + 1; i < aliceLeaveMonth; i++) {sumDays += getMonthDays(i);}sumDays += Math.min(aliceLeaveDay,bobLeaveDay);return sumDays+1;}}//bob月份先到} else {if (bobLeaveMonth < aliceArriveMonth) {//bob在alice到之前就走了return 0;//bob 走 的那个月 alice 到} else if (bobLeaveMonth == aliceArriveMonth) {return aliceArriveDay < bobLeaveDay ? (bobLeaveDay-aliceArriveDay)+1 : 0;//bob在alice到的月份之后的月份才走} else {//alice走的月份小于bobif (aliceLeaveMonth < bobLeaveMonth) {int sumDays = getMonthDays(aliceArriveMonth) - aliceArriveDay;for (int i = aliceArriveMonth + 1; i < aliceLeaveMonth; i++) {sumDays += getMonthDays(i);}sumDays += aliceLeaveDay;return sumDays+1;//alice走的月份大于bob} else if (aliceLeaveMonth > bobLeaveMonth) {int sumDays = getMonthDays(aliceArriveMonth) - aliceArriveDay;for (int i = aliceArriveMonth + 1; i < bobLeaveMonth; i++) {sumDays += getMonthDays(i);}sumDays += bobLeaveDay;return sumDays+1;//alice跟bob一个月走}else {int sumDays = getMonthDays(aliceArriveMonth) - aliceArriveDay;for (int i = aliceArriveMonth + 1; i < aliceLeaveMonth; i++) {sumDays += getMonthDays(i);}sumDays += Math.min(aliceLeaveDay,bobLeaveDay);return sumDays+1;}}}}//获取月份对应的天数public static int getMonthDays(int i){switch (i){case 1: return 31;case 2: return 28;case 3: return 31;case 4: return 30;case 5: return 31;case 6: return 30;case 7: return 31;case 8: return 31;case 9: return 30;case 10: return 31;case 11: return 30;case 12: return 31;default: return 0;}}
}

官方解较为巧妙,大家可以学习:

在这里插入图片描述
在这里插入图片描述

package keepcoding.leetcode.leetcode2409;
/*
我们可以设计一个函数 calculateDayOfYear 来计算输入中的每个日子在一年中是第几天。
计算输入中的每个日子在一年中是第几天时,可以利用前缀和数组来降低每次计算的复杂度。
知道每个日子是一年中的第几天后,可以先通过比较算出两人到达日子的最大值,离开日子的最小值,然后利用减法计算重合的日子
*/public class Result02 {public static void main(String[] args) {int days = countDaysTogether("10-01","11-01","11-01","12-31");System.out.println(days);}public static int countDaysTogether(String arriveAlice, String leaveAlice, String arriveBob, String leaveBob) {//将每个月份的天数存入数组int[] datesOfMonths = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//累加数组——计算每个月在这一年已经过了多少天int[] prefixSum = new int[13];for (int i = 0; i < 12; i++) {//i+1 是因为要在数组1-12的位置上一一对应的存入月份累加的天数  eg.一月这一年过了31天   二月过了31+28 三月31+28+31 ...prefixSum[i + 1] = prefixSum[i] + datesOfMonths[i];}//计算alice到的天数是一年的第几天int arriveAliceDay = calculateDayOfYear(arriveAlice, prefixSum);//计算alice走的天数是一年的第几天int leaveAliceDay = calculateDayOfYear(leaveAlice, prefixSum);//计算bob到的天数是一年的第几天int arriveBobDay = calculateDayOfYear(arriveBob, prefixSum);//计算bob走的天数是一年的第几天int leaveBobDay = calculateDayOfYear(leaveBob, prefixSum);//用Math.min(leaveAliceDay, leaveBobDay)计算谁先走的,Math.max(arriveAliceDay, arriveBobDay)计算谁后到的//如果存在共处的时间,先走的-后到的即为共处的天数//如果先走的-后到的 < 0 证明没有相遇共处的时间——return 0;// +1 是因为 如果alice走的那天bob到 根据题意这也算共处了一天 eg .alice 10-01到 10-31走 bob 10-31到 11-3走 ;根据先走的-后到的计算=0,但是有共处的一天,所以+1return Math.max(0, Math.min(leaveAliceDay, leaveBobDay) - Math.max(arriveAliceDay, arriveBobDay) + 1);}//计算是哪一天到的public static int calculateDayOfYear(String day, int[] prefixSum) {//String类的substring()方法 ——截取字符串  https://blog.csdn.net/Crezfikbd/article/details/119708978int month = Integer.parseInt(day.substring(0, 2));int date = Integer.parseInt(day.substring(3));return prefixSum[month - 1] + date;//到的这个月的前一个月总共过了多少天 再加上这个月到的日期 即为这一年的第几天}
}

知道思路后自己又手敲了一遍:

package keepcoding.leetcode.leetcode2409;public class DoItAgain {public static void main(String[] args) {int days = countTogetherDays("10-01","11-01","11-01","12-31");System.out.println(days);}//计算哪天到public static int countTogetherDays(String aliceArrive,String aliceLeave,String bobArrive,String bobLeave){int[] monthDays = {31,28,31,30,31,30,31,31,30,31,30,31};int[] preMonthSum = new int[13];for (int i = 0; i < monthDays.length; i++) {preMonthSum[i+1] = preMonthSum[i] + monthDays[i];}//计算alice一年中的第几天到int aComDay = countDay(aliceArrive,preMonthSum);//计算alice一年中的第几天走int aGoDay = countDay(aliceLeave,preMonthSum);//计算bob一年中的第几天到int bComDay = countDay(bobArrive,preMonthSum);//计算bob一年中的第几天走int bGoDay = countDay(bobLeave,preMonthSum);if (bComDay>aGoDay || aComDay>bGoDay){//没有相遇return 0;}else {//先走的-后到的日期return  Math.min(aGoDay,bGoDay) - Math.max(aComDay,bComDay) + 1;}}//计算各个时间点是这一年的第多少天public static int countDay(String s,int[] preMonthSum){//转化截取的字符串——得到到达的月份、日期int month = Integer.parseInt(s.substring(0,2));int day = Integer.parseInt(s.substring(3));//根据累加的数组结合当月到达的日期    计算到达的天数return preMonthSum[month-1]+day;}
}

相关文章:

LeetCode2409——统计共同度过的日子数

博主的解法过于冗长&#xff0c;是一直对着不同的案例debug修改出来的&#xff0c;不建议学习。虽然提交成功了&#xff0c;但是自己最后都不知道写的是啥了哈哈哈。 package keepcoding.leetcode.leetcode2409; /*Alice 和 Bob 计划分别去罗马开会。给你四个字符串 arriveA…...

【MyBatisPlus】快速入门、常用注解、常用配置

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 MyBatisPlus 一、快速入门1.1 引入MyBatisP…...

【USRP】通信之:光通信

光通信: 光通信是使用光信号&#xff08;通常是红外或可见光信号&#xff09;在光纤或空气中传输信息的技术。由于光信号的特性&#xff0c;光通信具有非常高的数据传输率和长距离传输能力。以下是光通信的一些关键组件和概念&#xff1a; 光纤&#xff1a; 是由非常纯净的玻璃…...

bpf对内核的观测

目录 1 bpftrace常用命令1.1 列出bpftrace 相关命令的list1. 2bpftrace -e 是执行1.3 查看参数 -lv 2 bpftrace 可以用到的变量3 高级3.1 内置函数3.2 文件系统3.3 内核内存 栈3.4 Malloc 调用 统计3.5 系统调用 brk 的 统计3.6 脚本调用 4 应用5 怎么串联起来呢 bpftrace 总的…...

Tiktok shop api 调试

记录一下调试Tiktok shop api 踩坑记录。 主要是在按官网api上规则和加密生成sign时候一直通不过的问题&#xff1a; 官网地址&#xff1a;https://partner.tiktokshop.com/doc/page/63fd743e715d622a338c4eab 直接贴代码了 import lombok.extern.slf4j.Slf4j;import javax.cr…...

QFSFileEngine::open: No file name specified解决方案

问题 使用QFile类进行文件操作时&#xff0c;报错QFSFileEngine::open: No file name specified。 原因 QFile::open: No file name specified是Qt中的一个错误消息&#xff0c;提示没有指定文件名导致文件无法打开。这个错误通常出现在使用QFile::open()函数时没有提供有效…...

Flappy bird项目

一、功能分析 1、小鸟自动向右滑行 2、按下空格小鸟上升&#xff0c;不按下落 3、显示小鸟需要穿过的管道 4、管道自动左移和创建 5、小鸟和管道碰撞&#xff0c;游戏结束 6、技术 7、 项目框图 8、Ncurses 1&#xff09;创建窗口界面&#xff0c;移动光标&#xff0c;产…...

高校教务系统登录页面JS分析——西安科技大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…...

Mysql 事务的实现原理

Mysql 里面的事务&#xff0c;满足 ACID 特性&#xff0c;所以Mysql 的事务实现原理&#xff0c;就是InnoDB 是如何保证 ACID 特性的。 ACID A 表示 Atomic 原子性&#xff0c;也就是需要保证多个 DML 操作是原子的&#xff0c;要么都成功&#xff0c;要么都失败。那么&#xf…...

使用vscode搭建虚拟机

首先vscode插件安装 名称: Remote - SSH ID: ms-vscode-remote.remote-ssh 说明: Open any folder on a remote machine using SSH and take advantage of VS Codes full feature set. 版本: 0.51.0 VS Marketplace 链接: https://marketplace.visualstudio.com/items?it…...

C# 使用 LibUsbDotNet 实现 USB 设备检测

国庆节回来后的工作内容&#xff0c;基本都在围绕着各种各样的硬件展开&#xff0c;这无疑让本就漫长的 “七天班” &#xff0c;更加平添了三分枯燥&#xff0c;我甚至在不知不觉中学会了&#xff0c;如何给打印机装上不同尺寸的纸张。华为的 Mate 60 发布以后&#xff0c;人群…...

系统安全分析与设计

系统安全分析与设计&#xff08;2分&#xff09; 内容提要 对称加密与非对称加密 加密技术与认证技术 加密技术&#xff08;只能防止第三方窃听&#xff09; 讲解地址&#xff1a;对称加密与非对称加密_哔哩哔哩_bilibili 认证技术 骚戴理解&#xff1a;数字签名是用私钥签名…...

UE4 AI群集实现

逻辑就不用说了&#xff0c;就是计算对应图形位置让每个Pawn移动到该位置 因为有时候AI与AI会卡住 所以加上这个Bool为true&#xff0c;以及设置两个AI之间至少隔的距离&#xff0c;设置在一个合理的参数即可 有时候AI群集&#xff0c;AI与AI会比较紧密&#xff0c;可以将Caps…...

机器学习---CNN(创建和训练一个卷积神经网络并评估其性能)下

import numpy as np import matplotlib.pyplot as plt from cnn_operations import cnn_operations as cnn_opr convolutional_neural_network模块&#xff1a; 1. 卷积神经网络类 def __init__(self):# 网络的层数self.n_layers 0# list&#xff0c;网络中的各层self.layers…...

2021-arxiv-Prefix-Tuning- Optimizing Continuous Prompts for Generation

2021-arxiv-Prefix-Tuning- Optimizing Continuous Prompts for Generation Paper&#xff1a;https://arxiv.org/pdf/2101.00190.pdf Code&#xff1a;https://github.com/XiangLi1999/PrefixTuning 前缀调优&#xff1a;优化生成的连续提示 prefix-tunning 的基本思想也是想…...

使用CMakeLists.txt简化项目构建过程

在软件开发过程中&#xff0c;项目的构建是一个不可避免的环节。而随着项目规模的增大&#xff0c;手动管理编译过程变得越来越繁琐。为了简化构建流程并实现跨平台支持&#xff0c;CMake作为一种流行的构建系统被广泛采用。本文将介绍CMakeLists.txt文件的结构&#xff0c;以及…...

构建并训练简单的CNN

1. 构建并训练深度神经网络模型 1.1 准备数据集 本次使用自己生成的一些数据,如下生成代码: # 准备数据集 # 此处自己生成一些原始的数据点 dataset_X=np.linspace(-10,10,100) dataset_y=2*np.square(dataset_X)+7...

Axi_Lite接口的IP核与地址与缓冲与AxiGP0

AXI Interconnect互连内核将一个或多个 AXI 内存映射主设备连接到一个或多个内存映射从设备。 AXI_GP 接口 AXI_GP 接口是直接连接主机互联和从机互联的端口的。 AXI_HP 接口具有一个 1kB 的数据 FIFO 来做缓冲 [4]&#xff0c;但是 AXI_GP 接口与它不同&#xff0c;没…...

maven以及配置

oss oss配置 <!--oss--> <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.6.0</version></dependency> lombok <!--lombok--><dependency><gro…...

系统可靠性分析与设计

系统可靠性分析与设计 内容提要 可靠性相关概念 骚戴理解&#xff1a;计算机系统的可靠性和可用性不是完全相同的概念&#xff0c;尽管它们在某些方面有重叠之处。 可靠性指的是计算机系统在特定时间段内正常运行的能力&#xff0c;即系统在面对各种故障或意外情况时能够继续…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...