【華為OD】解鎖犯罪時間

【華為OD】解鎖犯罪時間

題目描述

警察在偵破一個案件時,得到了線人給出的可能犯罪時間,形如"HH:MM"表示的時刻。根據警察和線人的約定,為了隱蔽,該時間是修改過的,解密規則為:利用當前出現過的數字,構造下一個距離當前時間最近的時刻,則該時間為可能的犯罪時間。每個出現數字都可以被無限次使用。

輸入描述

形如 HH:MM 的字符串,表示原始輸入

輸出描述

形如 HH:MM 的字符串,表示推理出來的犯罪時間

補充說明

  1. 可以保證線人給定的字符串一定是合法的。例如,"01:35"和"11:08"是合法的,"1:35"和"11:8"是不合法的
  2. 最近的時刻有可能在第二天

示例

輸入: 18:52
輸出: 18:55

解題思路

這道題的核心是要找到比給定時間大的最小時間,且新時間只能使用原時間中出現過的數字。

我們可以采用兩種不同的解法:

解法一:暴力枚舉法

思路分析

從給定時間開始,每次增加1分鐘,檢查新時間是否只使用了原時間中的數字。這種方法簡單直觀,但在最壞情況下可能需要遍歷較多時間。

Java實現

import java.util.*;public class Solution1 {public static String findNextTime(String time) {// 提取原時間中的所有數字Set<Character> availableDigits = new HashSet<>();for (char c : time.toCharArray()) {if (c != ':') {availableDigits.add(c);}}// 解析當前時間String[] parts = time.split(":");int hour = Integer.parseInt(parts[0]);int minute = Integer.parseInt(parts[1]);// 從下一分鐘開始尋找minute++;while (true) {// 處理時間進位if (minute >= 60) {minute = 0;hour++;if (hour >= 24) {hour = 0;}}// 格式化時間字符串String newTime = String.format("%02d:%02d", hour, minute);// 檢查新時間是否只使用了可用數字if (isValidTime(newTime, availableDigits)) {return newTime;}minute++;}}// 檢查時間字符串是否只使用了可用數字private static boolean isValidTime(String time, Set<Character> availableDigits) {for (char c : time.toCharArray()) {if (c != ':' && !availableDigits.contains(c)) {return false;}}return true;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();System.out.println(findNextTime(input));scanner.close();}
}

Python實現

def find_next_time(time):# 提取原時間中的所有數字available_digits = set(c for c in time if c != ':')# 解析當前時間hour, minute = map(int, time.split(':'))# 從下一分鐘開始尋找minute += 1while True:# 處理時間進位if minute >= 60:minute = 0hour += 1if hour >= 24:hour = 0# 格式化時間字符串new_time = f"{hour:02d}:{minute:02d}"# 檢查新時間是否只使用了可用數字if is_valid_time(new_time, available_digits):return new_timeminute += 1def is_valid_time(time, available_digits):"""檢查時間字符串是否只使用了可用數字"""return all(c == ':' or c in available_digits for c in time)# 主程序
if __name__ == "__main__":input_time = input().strip()print(find_next_time(input_time))

C++實現

#include <iostream>
#include <string>
#include <set>
#include <iomanip>
#include <sstream>
using namespace std;class Solution1 {
public:// 檢查時間字符串是否只使用了可用數字bool isValidTime(const string& time, const set<char>& availableDigits) {for (char c : time) {if (c != ':' && availableDigits.find(c) == availableDigits.end()) {return false;}}return true;}string findNextTime(const string& time) {// 提取原時間中的所有數字set<char> availableDigits;for (char c : time) {if (c != ':') {availableDigits.insert(c);}}// 解析當前時間int hour = stoi(time.substr(0, 2));int minute = stoi(time.substr(3, 2));// 從下一分鐘開始尋找minute++;while (true) {// 處理時間進位if (minute >= 60) {minute = 0;hour++;if (hour >= 24) {hour = 0;}}// 格式化時間字符串stringstream ss;ss << setfill('0') << setw(2) << hour << ":" << setfill('0') << setw(2) << minute;string newTime = ss.str();// 檢查新時間是否只使用了可用數字if (isValidTime(newTime, availableDigits)) {return newTime;}minute++;}}
};int main() {string input;cin >> input;Solution1 solution;cout << solution.findNextTime(input) << endl;return 0;
}

解法二:智能構造法

思路分析

這種方法更加高效,通過分析時間的結構,智能地構造下一個有效時間:

  1. 首先嘗試增加分鐘的個位數
  2. 如果不行,嘗試增加分鐘的十位數,個位數用最小可用數字
  3. 如果還不行,嘗試增加小時,分鐘用最小可用數字組合
  4. 最后考慮跨天的情況

Java實現

import java.util.*;public class Solution2 {public static String findNextTime(String time) {// 提取并排序可用數字List<Character> digits = new ArrayList<>();for (char c : time.toCharArray()) {if (c != ':') {digits.add(c);}}Collections.sort(digits);// 解析當前時間String[] parts = time.split(":");int hour = Integer.parseInt(parts[0]);int minute = Integer.parseInt(parts[1]);// 嘗試構造下一個有效時間String result = tryConstructNext(hour, minute, digits);return result;}private static String tryConstructNext(int hour, int minute, List<Character> digits) {// 1. 嘗試增加分鐘個位String result = tryIncrementMinuteUnit(hour, minute, digits);if (result != null) return result;// 2. 嘗試增加分鐘十位result = tryIncrementMinuteTen(hour, minute, digits);if (result != null) return result;// 3. 嘗試增加小時result = tryIncrementHour(hour, digits);if (result != null) return result;// 4. 跨天處理return constructEarliestTime(digits);}// 嘗試增加分鐘個位數private static String tryIncrementMinuteUnit(int hour, int minute, List<Character> digits) {int minuteUnit = minute % 10;int minuteTen = minute / 10;for (char d : digits) {int newUnit = d - '0';if (newUnit > minuteUnit && minuteTen * 10 + newUnit < 60) {return String.format("%02d:%d%d", hour, minuteTen, newUnit);}}return null;}// 嘗試增加分鐘十位數private static String tryIncrementMinuteTen(int hour, int minute, List<Character> digits) {int minuteTen = minute / 10;for (char d : digits) {int newTen = d - '0';if (newTen > minuteTen && newTen < 6) {int minUnit = digits.get(0) - '0';return String.format("%02d:%d%d", hour, newTen, minUnit);}}return null;}// 嘗試增加小時private static String tryIncrementHour(int hour, List<Character> digits) {// 嘗試增加小時個位int hourUnit = hour % 10;int hourTen = hour / 10;for (char d : digits) {int newUnit = d - '0';if (newUnit > hourUnit && hourTen * 10 + newUnit < 24) {return String.format("%d%d:%s", hourTen, newUnit, getMinMinute(digits));}}// 嘗試增加小時十位for (char d : digits) {int newTen = d - '0';if (newTen > hourTen && newTen < 3) {int minUnit = digits.get(0) - '0';if (newTen * 10 + minUnit < 24) {return String.format("%d%d:%s", newTen, minUnit, getMinMinute(digits));}}}return null;}// 構造最早的有效時間(用于跨天)private static String constructEarliestTime(List<Character> digits) {return String.format("%s:%s", getMinHour(digits), getMinMinute(digits));}// 獲取最小有效小時private static String getMinHour(List<Character> digits) {char min = digits.get(0);for (char d : digits) {if (d <= '2') {return String.format("%c%c", d, min);}}return String.format("%c%c", min, min);}// 獲取最小有效分鐘private static String getMinMinute(List<Character> digits) {char min = digits.get(0);for (char d : digits) {if (d <= '5') {return String.format("%c%c", d, min);}}return String.format("%c%c", min, min);}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();System.out.println(findNextTime(input));scanner.close();}
}

Python實現

def find_next_time(time):# 提取并排序可用數字digits = sorted([c for c in time if c != ':'])# 解析當前時間hour, minute = map(int, time.split(':'))# 嘗試構造下一個有效時間return try_construct_next(hour, minute, digits)def try_construct_next(hour, minute, digits):# 1. 嘗試增加分鐘個位result = try_increment_minute_unit(hour, minute, digits)if result:return result# 2. 嘗試增加分鐘十位result = try_increment_minute_ten(hour, minute, digits)if result:return result# 3. 嘗試增加小時result = try_increment_hour(hour, digits)if result:return result# 4. 跨天處理return construct_earliest_time(digits)def try_increment_minute_unit(hour, minute, digits):"""嘗試增加分鐘個位數"""minute_unit = minute % 10minute_ten = minute // 10for d in digits:new_unit = int(d)if new_unit > minute_unit and minute_ten * 10 + new_unit < 60:return f"{hour:02d}:{minute_ten}{new_unit}"return Nonedef try_increment_minute_ten(hour, minute, digits):"""嘗試增加分鐘十位數"""minute_ten = minute // 10for d in digits:new_ten = int(d)if new_ten > minute_ten and new_ten < 6:min_unit = int(digits[0])return f"{hour:02d}:{new_ten}{min_unit}"return Nonedef try_increment_hour(hour, digits):"""嘗試增加小時"""# 嘗試增加小時個位hour_unit = hour % 10hour_ten = hour // 10for d in digits:new_unit = int(d)if new_unit > hour_unit and hour_ten * 10 + new_unit < 24:return f"{hour_ten}{new_unit}:{get_min_minute(digits)}"# 嘗試增加小時十位for d in digits:new_ten = int(d)if new_ten > hour_ten and new_ten < 3:min_unit = int(digits[0])if new_ten * 10 + min_unit < 24:return f"{new_ten}{min_unit}:{get_min_minute(digits)}"return Nonedef construct_earliest_time(digits):"""構造最早的有效時間(用于跨天)"""return f"{get_min_hour(digits)}:{get_min_minute(digits)}"def get_min_hour(digits):"""獲取最小有效小時"""min_digit = digits[0]for d in digits:if int(d) <= 2:return f"{d}{min_digit}"return f"{min_digit}{min_digit}"def get_min_minute(digits):"""獲取最小有效分鐘"""min_digit = digits[0]for d in digits:if int(d) <= 5:return f"{d}{min_digit}"return f"{min_digit}{min_digit}"# 主程序
if __name__ == "__main__":input_time = input().strip()print(find_next_time(input_time))

C++實現

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <sstream>
using namespace std;class Solution2 {
private:// 獲取最小有效分鐘string getMinMinute(const vector<char>& digits) {char minDigit = digits[0];for (char d : digits) {if (d <= '5') {return string(1, d) + string(1, minDigit);}}return string(1, minDigit) + string(1, minDigit);}// 獲取最小有效小時string getMinHour(const vector<char>& digits) {char minDigit = digits[0];for (char d : digits) {if (d <= '2') {return string(1, d) + string(1, minDigit);}}return string(1, minDigit) + string(1, minDigit);}// 構造最早的有效時間string constructEarliestTime(const vector<char>& digits) {return getMinHour(digits) + ":" + getMinMinute(digits);}// 嘗試增加分鐘個位數string tryIncrementMinuteUnit(int hour, int minute, const vector<char>& digits) {int minuteUnit = minute % 10;int minuteTen = minute / 10;for (char d : digits) {int newUnit = d - '0';if (newUnit > minuteUnit && minuteTen * 10 + newUnit < 60) {stringstream ss;ss << setfill('0') << setw(2) << hour << ":" << minuteTen << newUnit;return ss.str();}}return "";}// 嘗試增加分鐘十位數string tryIncrementMinuteTen(int hour, int minute, const vector<char>& digits) {int minuteTen = minute / 10;for (char d : digits) {int newTen = d - '0';if (newTen > minuteTen && newTen < 6) {int minUnit = digits[0] - '0';stringstream ss;ss << setfill('0') << setw(2) << hour << ":" << newTen << minUnit;return ss.str();}}return "";}// 嘗試增加小時string tryIncrementHour(int hour, const vector<char>& digits) {// 嘗試增加小時個位int hourUnit = hour % 10;int hourTen = hour / 10;for (char d : digits) {int newUnit = d - '0';if (newUnit > hourUnit && hourTen * 10 + newUnit < 24) {return to_string(hourTen) + string(1, d) + ":" + getMinMinute(digits);}}// 嘗試增加小時十位for (char d : digits) {int newTen = d - '0';if (newTen > hourTen && newTen < 3) {int minUnit = digits[0] - '0';if (newTen * 10 + minUnit < 24) {return string(1, d) + to_string(minUnit) + ":" + getMinMinute(digits);}}}return "";}// 嘗試構造下一個有效時間string tryConstructNext(int hour, int minute, const vector<char>& digits) {// 1. 嘗試增加分鐘個位string result = tryIncrementMinuteUnit(hour, minute, digits);if (!result.empty()) return result;// 2. 嘗試增加分鐘十位result = tryIncrementMinuteTen(hour, minute, digits);if (!result.empty()) return result;// 3. 嘗試增加小時result = tryIncrementHour(hour, digits);if (!result.empty()) return result;// 4. 跨天處理return constructEarliestTime(digits);}public:string findNextTime(const string& time) {// 提取并排序可用數字vector<char> digits;for (char c : time) {if (c != ':') {digits.push_back(c);}}sort(digits.begin(), digits.end());// 解析當前時間int hour = stoi(time.substr(0, 2));int minute = stoi(time.substr(3, 2));// 嘗試構造下一個有效時間return tryConstructNext(hour, minute, digits);}
};int main() {string input;cin >> input;Solution2 solution;cout << solution.findNextTime(input) << endl;return 0;
}

總結

兩種解法各有優劣:

暴力枚舉法

  • 優點:邏輯簡單,易于理解和實現
  • 缺點:在最壞情況下可能需要遍歷很多時間點,效率較低

智能構造法

  • 優點:效率高,直接構造目標時間,時間復雜度更優
  • 缺點:實現復雜,需要考慮多種情況

對于這道題,由于時間范圍有限(24小時),兩種方法都能很好地解決問題。在實際應用中,可以根據具體需求選擇合適的解法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96897.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于linux操作系統的mysql安裝

一、檢查自己的操作系統是否已經有存在的mysql 1.存在 2.不存在 二、基于操作系統不存在mysql,找官方yum源 網址&#xff1a; Index of /232905https://repo.mysql.com/ 網站打開是這樣 看看自己的操作系統是哪個版本&#xff0c;再下載哪個版本&#xff0c;如果和我一樣裝…

如何用 Git Hook 和 CI 流水線為 FastAPI 項目保駕護航?

url: /posts/fc4ef84559e04693a620d0714cb30787/ title: 如何用Git Hook和CI流水線為FastAPI項目保駕護航? date: 2025-09-14T00:12:42+08:00 lastmod: 2025-09-14T00:12:42+08:00 author: cmdragon summary: 持續集成(CI)在FastAPI項目中通過頻繁合并代碼和自動驗證,確保…

【微服務】SpringBoot 整合Kafka 項目實戰操作詳解

目錄 一、前言 二、Kafka 介紹 2.1 什么是 Apache Kafka 2.2 Kafka 核心概念與架構 2.3 Kafka 為什么如此強大 2.4 Kafka 在微服務領域的應用場景 三、Docker 部署Kakfa服務 3.1 環境準備 3.2 Docker部署Kafka操作過程 3.2.1 創建docker網絡 3.2.2 啟動zookeeper容器…

多樓層室內定位可視化 Demo(A*路徑避障)

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>多樓層室內定位可視化 Demo&#xff08;A*避障&#xff09;</title> <style>body { margin: 0; overflow: hidden; }#layerControls { p…

vue2+jessibuca播放h265視頻(能播h264)

文檔地址&#xff1a;http://jessibuca.monibuca.com/api.html#background 1,文件放在public中 2,在html中引入 3&#xff0c;子組件 <template><div :id"container id"></div> </template><script> export default {props: [url,…

Docker命令大全:從基礎到高級實戰指南

Docker命令大全&#xff1a;從基礎到高級實戰指南 Docker作為現代容器化技術的核心工具&#xff0c;其命令體系是開發運維的必備技能。本文將系統整理常用命令&#xff0c;助您高效管理容器生態。一、基礎命令篇 1. 鏡像管理 # 拉取鏡像 $ docker pull nginx:latest# 查看本地鏡…

不鄰排列:如何優雅地避開“數字CP“

排列組合奇妙冒險&#xff1a;如何優雅地避開"數字CP"&#xff1f; ——容斥原理教你破解連續數對排列難題 &#x1f4dc; 問題描述 題目&#xff1a;求1,2,3,4,5,6,7,81,2,3,4,5,6,7,81,2,3,4,5,6,7,8的排列個數&#xff0c;使得排列中不出現連續的12,23,34,45,56,6…

S7-200 SMART PLC 安全全指南:配置、漏洞解析與復現防護

在工業自動化領域&#xff0c;PLC&#xff08;可編程邏輯控制器&#xff09;作為核心控制單元&#xff0c;其安全性直接關系到生產系統的穩定運行與數據安全。西門子 S7-200 SMART 系列 PLC 憑借高性價比、易用性等優勢&#xff0c;廣泛應用于中小型自動化項目。但實際使用中&a…

【計算機網絡 | 第14篇】應用層協議

文章目錄 應用層協議的核心定義&#xff1a;“通信合同”的關鍵內容&#x1f95d;應用層協議的分類&#xff1a;公共標準 vs 專有協議&#x1f9fe;公共標準協議專有協議 應用層協議與網絡應用的關系&#x1f914;案例1&#xff1a;Web應用案例2&#xff1a;Netflix視頻服務 應…

小迪web自用筆記33

再次提到預編譯&#xff0c;不會改變固定邏輯。id等于什么的只能更換頁面。過濾器&#xff1a;代碼一旦執行在頁面中&#xff0c;就會執行&#xff0c;xss跨站。Js的特性是顯示在頁面中之后開始執行&#xff0c;那個代碼是打印過后然后再渲染。是的&#xff0c;核心是**“打印&…

Zynq開發實踐(FPGA之第一個vivado工程)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】數字電路設計&#xff0c;如果僅僅是寫寫代碼&#xff0c;做做verilog仿真&#xff0c;那么其實是不需要轉移到fpga上面的。這就好比是算法工程師&a…

【Selenium】Selenium 測試失敗排查:一次元素定位超時的完整解決之旅

Selenium 測試失敗排查:一次元素定位超時的完整解決之旅 在自動化測試過程中,我們經常會遇到元素定位超時的問題。本文記錄了一次完整的 Selenium TimeoutException 排查過程,從問題發現到最終解決,涵蓋了各種常見陷阱和解決方案。 問題背景 測試用例在執行過程中失敗,…

32.網絡基礎概念(二)

局域網網絡傳輸流程圖兩臺主機在同一個局域網&#xff0c;是否能夠直接通信&#xff1f;以太網原理舉例&#xff1a;上課&#xff0c;老師點名小王讓他站起來回答問題。教室里的其他人是可以聽見的&#xff0c;為什么其他人不響應&#xff1f;因為老師叫的是小王&#xff0c;和…

【高并發內存池】六、三種緩存的回收內存過程

文章目錄前言Ⅰ. thread cache的內存回收Ⅱ. central cache的內存回收Ⅲ. page cache的內存回收前言 ? 前面我們將內存的申請流程都走通了&#xff0c;現在就是內存回收的過程&#xff0c;主要是從 thread cache 開始&#xff0c;一層一層往下回收&#xff0c;因為我們調用的…

DeerFlow 實踐:華為IPD流程的評審智能體設計

目錄 一、項目背景與目標 二、IPD 流程關鍵評審點與 TR 點解析 &#xff08;一&#xff09;4 個關鍵評審點 &#xff08;二&#xff09;6 個 TR 點 三、評審智能體詳細設計與協作機制 機制設計核心原則 &#xff08;一&#xff09;概念評審&#xff08;CDCP&#xff09;…

【ubuntu】ubuntu中找不到串口設備問題排查

ubuntu中找不到串口問題排查1. 檢查設備識別情況2. 檢查并安裝驅動3. 檢查內核消息4. 禁用brltty服務1. 停止并禁用 brltty 服務2. 完全移除 brltty 包3. 重啟系統或重新插拔設備5.輸出結果問題&#xff1a;虛擬機ubuntu中&#xff0c;已經顯示串口設備連接成功&#xff0c;但是…

Unity 性能優化 之 靜態資源優化 (音頻 | 模型 | 紋理 | 動畫)

Unity 之 性能優化 -- 靜態資源優化參考性能指標靜態資源資源工作流程資源分類原理小結Audio 實戰優化建議模型導入工作流程DCC中模型導出.DCC中Mesh生產規范模型導出檢查流程模型優化建議紋理優化紋理基礎概念紋理類型紋理大小紋理顏色空間紋理壓縮紋理圖集紋理過濾紋理Mipmap…

GitHub 熱榜項目 - 日榜(2025-09-13)

GitHub 熱榜項目 - 日榜(2025-09-13) 生成于&#xff1a;2025-09-13 統計摘要 共發現熱門項目&#xff1a;18 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜項目呈現三大技術熱點&#xff1a;AI開發工具化&#xff08;如GenKit、ROMA多智能體框架&#xff…

Pytest 常見問題及其解決方案

常見問題及解決方案 1. 測試通過了,但覆蓋率不達標 現象: 雖然所有測試都通過了,但覆蓋率報告顯示某些代碼沒有被覆蓋。 解決方案: 檢查覆蓋率配置:確保 .coveragerc 或 pytest.ini 中正確設置了要分析的源代碼路徑。 使用標記(markers)排除測試文件本身:避免測試代…

直擊3D內容創作痛點-火山引擎多媒體實驗室首次主持SIGGRAPH Workshop,用前沿技術降低沉浸式內容生成門檻

當3D、VR技術在游戲、教育、醫療、文化領域遍地開花&#xff0c;“內容短缺”卻成了制約行業爆發的關鍵瓶頸——傳統3D/4D創作不僅耗時耗力、依賴專業技能&#xff0c;還難以適配消費級設備&#xff0c;讓許多創作者望而卻步。近日&#xff0c;由火山引擎多媒體實驗室聯合領域頂…