分享一個項目中遇到的一個算法題

需求背景:

需求是用戶要創建一個任務計劃在未來執行,要求在創建任務計劃的時候判斷選擇的時間是否符合要求,否則不允許創建,創建的任務類型有兩種,一種是單次,任務只執行一次;另一種是周期,從周一到周日,任務可以重復執行。如果選擇單次執行,在選擇時間的時候要判斷選擇的時間是否大于當前時間,如果小于當前時間那么當前任務將不在當天執行而是第二天的同一時間執行,反之是在當天執行。確定好哪一天執行之后還要判斷那一天是否有已經創建的任務,如果有再判斷同一天的兩個時間點是否相差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.pswp.cn/diannao/73763.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73763.shtml
英文地址,請注明出處:http://en.pswp.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;能讓開發者創建出具有高度視覺吸引力和交互性的應用…