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

分享一个项目中遇到的一个算法题

需求背景:

需求是用户要创建一个任务计划在未来执行,要求在创建任务计划的时候判断选择的时间是否符合要求,否则不允许创建,创建的任务类型有两种,一种是单次,任务只执行一次;另一种是周期,从周一到周日,任务可以重复执行。如果选择单次执行,在选择时间的时候要判断选择的时间是否大于当前时间,如果小于当前时间那么当前任务将不在当天执行而是第二天的同一时间执行,反之是在当天执行。确定好哪一天执行之后还要判断那一天是否有已经创建的任务,如果有再判断同一天的两个时间点是否相差15分钟,如果在15分钟以内则时间发生碰撞不允许创建。如果选择周期执行,也要和已经创建的单次任务或者周期任务进行时间检查,另外两个任务如果不在同一天执行,还要判断在跨天时间点上是否相差15分钟,比如周一晚上23:55和周二凌晨00:05相差10分钟,也是属于时间冲突,那么基于这个需求写一下时间冲突的逻辑判断。

最终调用函数获取结果代码:

 val checkResult = mViewModel.checkTime(DateUtil.convertTimeToMinutes(startTimeStr),StringUtil.convertStringToList(cycleDay),vehReservationStandListBean,mPreBean?.keyId,)if (!checkResult.first) {"任务时间冲突,任务名称: ${checkResult.second}, 请重新选择时间点".showToast()return false}

具体检查时间冲突逻辑:

(入参格式:newStartTime="11:30" --> 11*60+30,代表字符串格式hh:mm转成分钟数 

  newCycleDay = 0,1,2,3,4,5,6,7的list集合,list代表一个已经创建的任务数据体集合)

/*** 时间和周期是否允许创建 */fun checkTime(newStartTime: Int?,newCycleDay: List<Int>?,list: List<ReservationStandSetOperationBean>?,): Pair<Boolean, String?> {if (newStartTime == null || newCycleDay == null) {return Pair(false, "")}// 获取新任务的时间段val newTimeSlots = DateUtil.getTimeSlots(newCycleDay, newStartTime)for (model in list ?: emptyList()) {val existingStartTime = DateUtil.convertTimeToMinutes(model.carReadyTime)val existingCycleDay = StringUtil.convertStringToList(model.cycleDay)if (existingStartTime == null || existingCycleDay == null) {continue}// 获取已存在任务的时间段val existingTimeSlots = DateUtil.getTimeSlots(existingCycleDay, existingStartTime)// 检查时间段是否重叠for (newSlot in newTimeSlots) {for (existingSlot in existingTimeSlots) {if (DateUtil.isTimeOverlap(newSlot, existingSlot)) {return Pair(false, model.planName)}}}}return Pair(true, "")}

 返回需要执行时间碰撞的数据集合:

// 获取任务的执行日期和时间段fun getTimeSlots(days: List<Int>, startTime: Int): List<Triple<Int, Int, Int>> {val result = mutableListOf<Triple<Int, Int, Int>>()val minutesInDay = 24 * 60val calendar = Calendar.getInstance()val now = Date()val currentTime =calendar.get(Calendar.HOUR_OF_DAY) * 60 + calendar.get(Calendar.MINUTE)val weekday = calendar.get(Calendar.DAY_OF_WEEK)val today = if (weekday == Calendar.SUNDAY) 7 else weekday - 1for (day in days) {//任务执行的日期var adjustedDay = day// 如果是单次任务 需要判断是否需要加一天if (days == listOf(0)) {// 如果任务的开始时间小于当前时间,推迟到明天if (startTime <= currentTime) {adjustedDay = if (today == 7) 1 else today + 1} else {adjustedDay = today}}val endTime = startTime + 15// 如果任务跨天if (endTime >= minutesInDay) {// 当天的时间段  日期,起始时间,终止时间result.add(Triple(adjustedDay, startTime, minutesInDay))// 第二天的时间段 日期,起始时间,终止时间result.add(Triple(if (adjustedDay == 7) 1 else adjustedDay + 1,0,endTime - minutesInDay))} else {// 不跨天的时间段  日期,起始时间,终止时间result.add(Triple(adjustedDay, startTime, endTime))}}return result}

判断两个数据集合是否时间段有重叠: 

  // 检查时间段是否重叠fun isTimeOverlap(slot1: Triple<Int, Int, Int>, slot2: Triple<Int, Int, Int>): Boolean {// 如果日期不同,则不重叠if (slot1.first != slot2.first) {return false}// 检查时间段是否重叠return slot1.second < slot2.third && slot2.second < slot1.third}

结语:实际项目中用到的算法逻辑大多不复杂,这种需要动态计算任务执行时间,还要考虑跨天的逻辑比较少见,这里做个记录方便以后有类似逻辑可以做个代码参考。

相关文章:

分享一个项目中遇到的一个算法题

需求背景&#xff1a; 需求是用户要创建一个任务计划在未来执行&#xff0c;要求在创建任务计划的时候判断选择的时间是否符合要求&#xff0c;否则不允许创建&#xff0c;创建的任务类型有两种&#xff0c;一种是单次&#xff0c;任务只执行一次&#xff1b;另一种是周期&…...

TI的Doppler-Azimuth架构(TI文档)

TI在AWR2944平台上推出新的算法架构&#xff0c;原先的处理方式是做完二维FFT后在RD图上做CFAR检测&#xff0c;然后提取各个通道数据做测角。 Doppler-Azimuth架构则是做完二维FFT后&#xff0c;再做角度维FFT&#xff0c;生成Doppler-Azimuth频谱图&#xff0c;然后在该频谱图…...

电子邮件常用协议技术详解与C++实践(SMTP POP3 IMAP)

一、核心协议概览 协议端口&#xff08;明文/加密&#xff09;核心功能数据同步方式典型场景SMTP25 / 587邮件发送单向传输客户端提交邮件POP3110 / 995邮件下载单向同步单设备离线阅读IMAP143 / 993邮件管理双向同步多设备实时同步 二、协议深度解析 1. SMTP&#xff08;简单…...

机器学习算法:一文掌握 K近邻算法 的详细用法(2个案例可直接运行)

文章目录 一、KNN 算法概述1.1 算法原理1.2 KNN 的优缺点1.3 K 值的选择 二、Python 实现 KNN 案例2.1 使用 KNN 算法进行手写数字识别2.2 使用 Python 实现 KNN 分类 三、总结 KNN&#xff08;K-Nearest Neighbors&#xff0c;K近邻算法&#xff09; 是一种简单且常用的分类和…...

设计C语言的单片机接口

一、主要内容 (一)控制引脚 1、定义管脚 // 定义管脚的结构体 struct pin{ int id; // 管脚编号 int mode; // 模式&#xff0c;输入为1&#xff0c;输出为0 int pull; // 输入电阻 int driver; // 功率 } 2、输出电平 语法&#xff1a; void pin_output(s…...

[从零开始学习JAVA] Stream流

前言&#xff1a; 本文我们将学习Stream流&#xff0c;他就像流水线一样&#xff0c;可以对我们要处理的对象进行逐步处理&#xff0c;最终达到我们想要的效果&#xff0c;是JAVA中的一大好帮手&#xff0c;值得我们了解和掌握。&#xff08;通常和lambda 匿名内部类 方法引用相…...

「自动驾驶的数学交响曲:线性代数、微积分与优化理论的深度共舞」—— 解析人工智能背后的高阶数学工具链

引言 自动驾驶系统是数学工具链的集大成者。从传感器数据的多维空间映射到控制指令的生成,每一步都隐藏着线性代数、微积分、概率论和优化理论的精妙配合。本文将构建一个数学模型完整的自动驾驶案例,结合Python代码实现,揭示以下核心数学工具: 线性代数:张量运算与特征空…...

调试 Rust + WebAssembly 版康威生命游戏

1. 启用 Panic 日志 1.1 让 Panic 信息显示在浏览器控制台 如果 Rust 代码发生 panic!()&#xff0c;默认情况下不会在浏览器开发者工具中显示详细的错误信息。这使得排查问题变得困难。 我们可以使用 console_error_panic_hook 这个 Rust crate&#xff0c;将 Panic 信息打…...

VSCode通过SSH远程登录Windows服务器

系列 1.1 VSCode通过SSH远程登录Windows服务器 1.2 VSCode通过SSH免密远程登录Windows服务器 文章目录 系列1 准备工作2 远程服务器配置2.1 安装SSH服务器2.2 端口 3 本地电脑配置3.1 安装【Remote - SSH】。3.2 登录 1 准备工作 本地电脑Windows 11&#xff0c;已安装VS Cod…...

qt下载和安装教程国内源下载地址

qt不断在更新中&#xff0c;目前qt6日渐成熟&#xff0c;先前我们到官方下载或者国内镜像直接可以下载到exe文件安装&#xff0c;但是最近几年qt官方似乎在逐渐关闭旧版本下载通道&#xff0c;列为不推荐下载。但是qt5以其广泛使用和稳定性&#xff0c;以及积累大量代码使得qt5…...

使用htool工具导出和导入Excel表

htool官网 代码中用到的hool包里面的excel工具ExcelUtil 1. 引入依赖 <!-- Java的工具类 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency>&l…...

mysql 到 doris 挪移数据

工具datax..... 下载地址&#xff1a;http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 下载以后解压&#xff1a;tar -xvzf datax.tar.gz 然后&#xff0c;理论上就可以直接使用了。但是&#xff0c;datax本身是python2写的&#xff0c;如果需要python3…...

Springboot中的@ConditionalOnBean注解:使用指南与最佳实践

在使用Spring Boot进行开发时&#xff0c;大家应该都听说过条件注解&#xff08;Conditional Annotations&#xff09;。其中的ConditionalOnBean注解就很有趣&#xff0c;它帮助开发者在特定条件下创建和注入Bean&#xff0c;让你的应用更加灵活。今天就来聊聊这个注解的使用场…...

ubuntu系统下添加pycharm到快捷启动栏方法

一、背景 之前在ubuntu系统下使用pycharm时&#xff0c;总是要进入/home/dlut/pycharm-community-2022.1/bin文件夹下&#xff0c;然后终端执行命令下面的命令才可修改代码&#xff1a; ./pycharm.sh为了以后方便&#xff0c;这里给出添加pycharm到快捷启动栏的方法 二、添加…...

开源:LMDB 操作工具:lmcmd

目录 什么是 LMDB为什么编写 lmcmd安装方法如何使用 连接数据库命令列表 小结 1. 什么是 LMDB LMDB&#xff08;Lightning Memory-Mapped Database&#xff09;是一种高效的键值存储数据库&#xff0c;基于内存映射&#xff08;memory-mapping&#xff09;技术&#xff0c;提供…...

阿里云底层使用的虚拟化技术

‌阿里云底层使用的虚拟化技术主要是KVM&#xff08;[Kernel-based Virtual Machine&#xff09;‌。KVM是一种基于内核的虚拟机技术&#xff0c;它允许Linux内核直接管理虚拟机的创建和运行&#xff0c;提供高效的虚拟化解决方案‌12。 KVM技术的特点和应用场景 KVM具有以下…...

angular中的路由传参

目录 一、矩阵参数 一、矩阵参数 在angular中传参时可以使用矩阵参数&#xff0c;即直接通过变量值的形式在地址中体现&#xff0c;但需要注意参数的使用范围为当前路径段&#xff0c;而不是全局的查询参数。 const params {name: lhhh,age: 18,list: [{ name: htt }],}; //先…...

AI时代下的心理咨询师新利器:心理咨询小程序

在AI技术日新月异的今天&#xff0c;心理咨询师们也需要与时俱进&#xff0c;借助新型工具来提升咨询效率和服务质量。正如一位优秀的厨师离不开一把锋利的菜刀&#xff0c;心理咨询师同样需要一款得力助手来辅助其工作。而心理咨询小程序&#xff0c;正是这样一款应运而生的工…...

垃圾分类--环境配置

写在前面&#xff1a; 如果你们打这届比赛时&#xff0c;还有我们所保留的内存卡&#xff0c;那么插上即可运行&#xff08;因为内存卡里我们已经配置好所有的环境&#xff09; 本文提供两种环境的配置 一种是基于yolov8&#xff1a;YOLOv8 - Ultralytics YOLO Docshttps://d…...

每日一题--计算机网络

一、基础概念类问题 1. TCP 和 UDP 的区别是什么&#xff1f; 回答示例&#xff1a; TCP&#xff1a;面向连接、可靠传输&#xff08;通过三次握手建立连接&#xff0c;丢包重传&#xff09;、保证数据顺序&#xff08;如文件传输、网页访问&#xff09;。 UDP&#xff1a;无…...

json字符串转对象,对象转JSON

背景&#xff1a; JSON字符串与对象之间的转换。在对接接口的数据的时候&#xff0c;因为是实时数据转发过来的。发现后端发过的数据是字符串【JSON字符串】但是我们前端需要的是一个对象。 核心代码&#xff1a; JSON.parse(JSON字符串) 效果展示&#xff1a; 接口JSON字符串转…...

c++ 基础题目lambda

1. auto lambda = [](double x) { return static_cast<int>(x); }; 是 匿名函数对象 ,不可直接声明 a.可以赋值给一个与其类型兼容的 std::function 类型的对象 std::function<int(int, int)> lambda = [](int x, int y) { return x + y; }; b.使用具体的 lambda …...

pandas中excel自定义单元格颜色

writerpd.ExcelWriter(filepathf05教师固定学生占比1月{today}.xlsx,engineopenpyxl) df.to_excel(writer,sheet_name明细) piv1.to_excel(writer,sheet_name1月分布) wswriter.book.create_sheet(口径) ws.cell(1,1).value综合占比&#xff1a; ws.cell(1,2).value固定学生占比…...

3D标定中的平面约束-平面方程的几何意义

平面方程的一般形式为 AxByCzD0&#xff0c;其中系数 A、B、C、D共同决定了平面的几何特性。 系数对平面姿态的影响 1. 法向量方向2. 平面位置3. 比例关系4. 姿态变换5.平面空间变换 1. 法向量方向 法向量方向由 A、B、C 决定 核心作用&#xff1a;系数 A、B、C 构成的向量 (…...

蓝桥杯第13届真题2

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 二.按键 按键配置&#xff0c;由原理图按键所对引脚要GPIO_Input 生成代码&a…...

Linux-03 删除ubuntu系统文件夹Videos和Templates后,如何恢复

文章目录 问题解决方法1. 重新创建 Videos 和 Templates 文件夹2. 配置 user-dirs.dirs 文件3. 更新用户目录配置xdg-user-dirs-update4. 重启系统&#xff1a;sudo reboot 问题 手欠的嫌弃Videos和Templates文件夹是空的&#xff0c;也不会用&#xff0c;就删除了&#xff0c…...

springboot多种生产打包方式教程

在 Spring Boot 项目中&#xff0c;打包是一个非常重要的环节&#xff0c;因为它决定了应用程序如何部署到生产环境中。Spring Boot 提供了多种打包方式&#xff0c;以满足不同的需求和环境。以下是详细的教程&#xff0c;介绍 Spring Boot 的多种生产打包方式以及它们的适用场…...

Linux系统移植篇(十)根文件系统构建 V3 - Yocto

可以简单的将 Ubuntu 理解为一个根文件系统&#xff0c;和我们用 busybox、buildroot 制作的根文件系统一样。因此移植Ubuntu也就是将Ubuntu根文件系统移植到我们的开发板上&#xff0c;但是因为 I.MX6ULL 孱弱的性能&#xff0c;本章我们就只移植 Ubuntu 的最小根文件系统&…...

pnpm创建vite

pnpm创建vite 在创建一个使用 Vite 的项目时&#xff0c;你可以通过 PNPM&#xff08;一个快速、节省磁盘空间的包管理器&#xff09;来简化依赖管理。以下是如何使用 PNPM 创建一个 Vite 项目的步骤&#xff1a; 安装 PNPM 如果你还没有安装 PNPM&#xff0c;可以通过 npm&…...

NAT技术-初级总结

NAT–网络地址转换 NAT基本逻辑是实现公网IP地址和私网IP地址的转换 华为设备所有NAT相关的配置都是在边界路由器的出接口上配置 1.静态NAT–一对一 就是在我们私网边界路由器上建立维护一张静态地址映射表,这张表 反映的是公网IP地址和私网IP地址之间一一对应的关系 只能一个…...