当前位置: 首页 > 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;即系统在面对各种故障或意外情况时能够继续…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...