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

需求背景:

需求是用户要创建一个任务计划在未来执行,要求在创建任务计划的时候判断选择的时间是否符合要求,否则不允许创建,创建的任务类型有两种,一种是单次,任务只执行一次;另一种是周期,从周一到周日,任务可以重复执行。如果选择单次执行,在选择时间的时候要判断选择的时间是否大于当前时间,如果小于当前时间那么当前任务将不在当天执行而是第二天的同一时间执行,反之是在当天执行。确定好哪一天执行之后还要判断那一天是否有已经创建的任务,如果有再判断同一天的两个时间点是否相差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}

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

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

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

相关文章

【LInux进程六】命令行参数和环境变量

【LInux进程六】命令行参数和环境变量 1.main函数的两个参数2.利用main函数实现一个简单的计算器3.环境变量之一&#xff1a;PATH4.修改PATH5.在命令行解释器bash中查看所有环境变量6.用自己写的程序查看环境变量7.main函数的第三个参数8.本地的环境变量和环境变量9.环境变量具…

时间轴版本-2.0

文章简述 这是本人自己封装的时间轴2.0版本的代码&#xff0c;用到了TypeScriptJavaScript 这篇文章只有代码和具体的使用方式&#xff0c;如果想看具体的讲解可以参考本人写的时间轴1.0版本的&#xff0c;在1.0版本中可能计算时间线的逻辑略有不同&#xff0c;但是大致的计算…

大语言模型的压缩技术

尽管人们对越来越大的语言模型一直很感兴趣&#xff0c;但MistralAI 向我们表明&#xff0c;规模只是相对而言的&#xff0c;而对边缘计算日益增长的兴趣促使我们使用小型语言获得不错的结果。压缩技术提供了一种替代方法。在本文中&#xff0c;我将解释这些技术&#xff0c;并…

大华HTTP协议在智联视频超融合平台中的接入方法

一. 大华HTTP协议介绍 大华HTTP协议是大华股份&#xff08;Dahua Technology&#xff09;为其安防监控设备开发的一套基于HTTP/HTTPS的通信协议&#xff0c;主要用于设备与客户端&#xff08;如PC、手机、服务器&#xff09;之间的数据交互。该协议支持设备管理、视频流获取、…

Linux内核实时机制28 - RT调度器11 - RT 组调度

Linux内核实时机制28 - RT调度器11 - RT 组调度 相关数据结构 内核中通过static int sched_rt_runtime_exceeded(struct rt_rq *rt_rq)函数来判断实时任务运行时间是否超出带宽限制,判断这个运行队列rt_rq的运行时间是否超过了额定的运行时间。而“运行时间”和“额定时间”都…

java,poi,提取ppt文件中的文字内容

注意&#xff0c;不涉及图片处理。 先上pom依赖&#xff1a; <!-- 处理PPTX文件 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><!--…

7、vue3做了什么

大佬认为有何优点&#xff1a; 组合式api----逻辑集中、对ts有更好的支持RFC–开放了一个讨论机制&#xff0c;可以看到每一个api的提案&#xff0c;方便源码维护&#xff0c;功能扩展&#xff0c;大家一起讨论 官方rfc响应式独立&#xff0c;new Proxy&#xff0c;天生自带来…

多人在线聊天系统,创建群,视频,语音,自带带授权码

多人在线聊天系统&#xff0c;创建群&#xff0c;视频&#xff0c;语音 带授权码&#xff0c;授权码限制 10 个网站&#xff0c;需要下载研究吧 在线聊天&#xff0c;创建群&#xff0c;表情&#xff0c;图片&#xff0c;文件&#xff0c;视频&#xff0c;语音&#xff0c;自…

数据结构概览

关键点&#xff1a; 数据结构是组织和存储数据的方式&#xff0c;帮助高效访问和操作数据。常见类型包括数组、链表、栈、队列、树和图&#xff0c;每种都有特定用途。代码示例和实际应用场景将帮助初学者理解这些概念。 什么是数据结构&#xff1f; 数据结构就像你整理书架或…

Android studio点击运行按钮在build\intermediates\apk\debug目录下生成的apk在真机上安装失败,提示test only

Android studio点击运行按钮在build\intermediates\apk\debug目录下生成的apk在真机上安装失败&#xff0c;提示test only DeepSeek R1 思考 15 秒 思考过程 针对Android Studio生成的APK在真机安装时提示“test only”的问题&#xff0c;以下是详细解决方案&#xff1a; 1.…

NFC 碰一碰发视频源码搭建,支持OEM

一、引言 NFC&#xff08;Near Field Communication&#xff09;近场通信技术&#xff0c;以其便捷、快速的数据交互特性&#xff0c;正广泛应用于各个领域。其中&#xff0c;NFC 碰一碰发视频这一应用场景&#xff0c;为用户带来了新颖且高效的视频分享体验。想象一下&#x…

Python基础语法全解析:从入门到实践

Python作为一门简洁高效、功能强大的编程语言&#xff0c;凭借其易读性和丰富的生态系统&#xff0c;已成为编程领域的“明星语言”。本文将系统讲解Python的核心语法&#xff0c;涵盖变量、数据类型、控制结构、函数、模块等核心概念&#xff0c;帮助读者快速掌握编程基础。 一…

TypeScript中的类型断言(type assertion),如何使用类型断言进行类型转换?

一、什么是类型断言&#xff1f; 类型断言&#xff08;Type Assertion&#xff09;是 TypeScript 中一种显式指定变量类型的方式&#xff0c;它告诉编译器&#xff1a;“我比编译器更清楚这个值的类型”。​这不是运行时类型转换&#xff0c;而是编译阶段的类型声明辅助机制。…

分区表和分表

分区表&#xff08;Partitioning&#xff09; 定义 分区表是将单个表的数据按照某种规则&#xff08;如范围、列表、哈希等&#xff09;划分为多个逻辑部分&#xff0c;每个部分称为一个分区。数据仍然存储在一个物理表中&#xff0c;但逻辑上被分割为多个分区。 特点 逻辑…

C++从入门到入土(八)——多态的原理

目录 前言 多态的原理 动态绑定与静态绑定 虚函数表 小结 前言 在前面的文章中&#xff0c;我们介绍了C三大特性之一的多态&#xff0c;我们主要介绍了多态的构成条件&#xff0c;但是对于多态的原理我们探讨的是不够深入的&#xff0c;下面这这一篇文章&#xff0c;我们将…

用Maven创建只有POM文件的项目

使用 mvn 创建一个仅包含 pom.xml 文件的父项目&#xff0c;可以借助 maven-archetype-quickstart 原型&#xff0c;然后移除不必要的文件&#xff0c;或者直接通过命令生成最简的 pom.xml 文件。以下是具体操作步骤&#xff1a; 一、方法一&#xff1a;使用原型创建后清理 1…

Linux目录理解

前言 最近在复习linux&#xff0c;发现有些目录总是忘记内容&#xff0c;发现有些还是得从原义和实际例子去理解会记忆深刻些。以下是个人的一些理解 Linux目录 常见的Linux下的目录如下&#xff1a; 1. 根目录 / (Root Directory) 英文含义&#xff1a;/ 是文件系统的根…

gitee AI使用

gitee AI使用 gitee AI使用 gitee AI使用简介正文开始1. 安装openai2. 测试2.1 不使用流2.2 使用流 2.3 使用curl工具 简介 发现gitee 推出了个ai帮助多数人使用ai&#xff0c;突破算力和模型的壁垒&#xff0c;我就遵从开源精神&#xff0c;测试了下&#xff0c;希望可以帮助…

c++领域展开第十七幕——STL(vector容器的模拟实现以及迭代器失效问题)超详细!!!!

文章目录 前言vector——基本模型vector——迭代器模拟实现vector——容量函数以及push_back、pop_backvector——默认成员函数vector——运算符重载vector——插入和删除函数vector——实现过程的问题迭代器失效memcpy的浅拷贝问题 总结 前言 上篇博客我们已经详细介绍了vecto…

WPF 开发从入门到进阶(五)

一、WPF 简介与开发环境搭建 1.1 WPF 概述 Windows Presentation Foundation&#xff08;WPF&#xff09;是微软推出的用于构建 Windows 桌面应用程序的强大 UI 框架。它融合了矢量图形、动画、多媒体等多种技术&#xff0c;能让开发者创建出具有高度视觉吸引力和交互性的应用…