news 2026/4/24 7:07:06

华为OD机试真题 新系统 - 计费时段计算 (Java/Py/C/C++/Js/Go)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机试真题 新系统 - 计费时段计算 (Java/Py/C/C++/Js/Go)

计费时段计算

2026 华为OD机试真题 4月22日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

电力公司的电费根据用电的时间,采用三挡计费:

第一档:用电时间在每天的12 : 00 12:0012:00-13 : 30 13:3013:3017 : 30 17:3017:30-18 : 00 18:0018:00

第二档:每天从0 : 00 0:000:00起的,且不在第一档时段内的,累积的10 1010小时

第三档:其他时段

某设备每天开关机一次(0 : 00 0:000:00之前必然关机)。统计这台设备每天各个时段的开机时长,用分钟表示。

时间格式H H : M M HH:MMHH:MM24 2424小时制 说明:小时不足两位不补零,分钟严格保持两位。例如:8 : 08 8:088:08

输入描述

H H : M M HH:MMHH:MMH H : M M HH:MMHH:MM”,两个时间分别为设备开机时间、设备关机时间,中间空格间隔。例如:“8 : 00 8:008:0023 : 30 23:3023:30”。

约束

  1. 结束时间不超过0 : 00 0:000:00(最大为23 : 59 23:5923:59),即不考虑跨天的情况。
  2. 如果开机时间跟关机时间相等,则认为是开机0 00分钟。例如:“8 : 00 8:008:008 : 00 8:008:00

输出描述

整数数组,依次为第一、二、三档的时长,单位:分钟。例如:[ 120 , 600 , 210 ] [120,600,210][120,600,210]

示例1

输入

8:00 23:30

输出

[120,600,210]

说明

  • 第一档:12 : 00 12:0012:00-13 : 30 13:3013:3017 : 30 17:3017:30-18 : 00 18:0018:00,共120 120120分钟
  • 第二档:8 : 00 8:008:00-12 : 00 12:0012:0013 : 30 13:3013:30-17 : 30 17:3017:3018 : 00 18:0018:00-20 : 00 20:0020:00,共600 600600分钟,达到10 1010小时上限。其余的时间要归到第三档
  • 第三档:20 : 00 20:0020:00-23 : 30 23:3023:30,共210 210210分钟

示例2

输入

13:00 17:45

输出

[45,240,0]

说明

  • 第一档:13 : 00 13:0013:00-13 : 30 13:3013:3017 : 30 17:3017:30-17 : 45 17:4517:45,共45 4545分钟
  • 第二档:13 : 30 13:3013:30-17 : 30 17:3017:30,共240 240240分钟
  • 第三档:由于第二档还没达到10 1010小时,第三档时间为0 00

解题思路

核心思想

  1. 时间转换:将所有输入的时间格式(HH:MM)转换为从当天0 : 00 0:000:00开始的总分钟数,方便计算。
  2. 档位规则
    • 第一档:固定时段12 : 00 12:0012:00-13 : 30 13:3013:30720 720720-810 810810分钟)和17 : 30 17:3017:30-18 : 00 18:0018:001050 10501050-1080 10801080分钟)。
    • 第二档:非第一档时段内的开机时间,每天累积上限为10 1010小时(600 600600分钟)。
    • 第三档:超过第二档上限后的所有其他开机时间。
  3. 模拟计算:从开机时间遍历到关机时间,每一分钟判断其属于哪一档:
    • 如果当前分钟在第一档时段内,计入第一档。
    • 如果不在第一档时段:
      • 如果已计入第二档的时间未满600 600600分钟,计入第二档。
      • 否则,计入第三档。
  4. 输出结果:以数组形式输出三个档位的总时长。

复杂度分析

  • 时间复杂度O ( L ) O(L)O(L),其中L LL是开关机之间的时间跨度(分钟)。由于一天最多只有1440 14401440分钟,因此计算非常高效。
  • 空间复杂度O ( 1 ) O(1)O(1),只需要常数级别的变量来存储各档位的时间。

Java

importjava.util.Scanner;/** * 华为OD机试 - 计费时段计算 */publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);if(!sc.hasNext())return;// 读取开机和关机时间StringstartStr=sc.next();StringendStr=sc.next();intstart=toMinutes(startStr);intend=toMinutes(endStr);inttier1=0;inttier2=0;inttier3=0;inttier2Limit=600;// 第二档上限 600 分钟// 逐分钟进行模拟计算for(inti=start;i<end;i++){if(isTier1(i)){tier1++;}else{if(tier2<tier2Limit){tier2++;}else{tier3++;}}}// 输出结果格式 [T1, T2, T3]System.out.println("["+tier1+","+tier2+","+tier3+"]");}/** * 将 HH:MM 格式转换为总分钟数 */privatestaticinttoMinutes(Stringtime){String[]parts=time.split(":");returnInteger.parseInt(parts[0])*60+Integer.parseInt(parts[1]);}/** * 判断当前分钟是否属于第一档时段 * 第一档:12:00-13:30 (720-810) 和 17:30-18:00 (1050-1080) */privatestaticbooleanisTier1(intm){return(m>=720&&m<810)||(m>=1050&&m<1080);}}

Python

importsysdefto_minutes(t_str):"""将 HH:MM 转换为分钟"""h,m=map(int,t_str.split(':'))returnh*60+mdefis_tier1(m):"""判断是否为第一档时段"""# 12:00-13:30 (720-810), 17:30-18:00 (1050-1080)return(720<=m<810)or(1050<=m<1080)defsolve():# 读取输入line=sys.stdin.read().strip()ifnotline:returntimes=line.split()iflen(times)<2:returnstart=to_minutes(times[0])end=to_minutes(times[1])t1,t2,t3=0,0,0t2_limit=600# 模拟每一分钟forminrange(start,end):ifis_tier1(m):t1+=1else:ift2<t2_limit:t2+=1else:t3+=1# 格式化输出print(f"[{t1},{t2},{t3}]")if__name__=="__main__":solve()

JavaScript

constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,terminal:false});rl.on('line',(line)=>{if(!line.trim())return;constparts=line.trim().split(/\s+/);if(parts.length<2)return;consttoMinutes=(t)=>{const[h,m]=t.split(':').map(Number);returnh*60+m;};conststart=toMinutes(parts[0]);constend=toMinutes(parts[1]);lett1=0,t2=0,t3=0;constt2Limit=600;// 逐分钟判断for(letm=start;m<end;m++){// 第一档判断if((m>=720&&m<810)||(m>=1050&&m<1080)){t1++;}else{// 第二、三档判断if(t2<t2Limit){t2++;}else{t3++;}}}console.log(`[${t1},${t2},${t3}]`);});

C++

#include<iostream>#include<string>#include<vector>#include<sstream>usingnamespacestd;/** * 将 HH:MM 格式的时间转换为分钟 */inttoMinutes(string t){inth,m;sscanf(t.c_str(),"%d:%d",&h,&m);returnh*60+m;}/** * 判断是否属于第一档 */boolisTier1(intm){return(m>=720&&m<810)||(m>=1050&&m<1080);}intmain(){string s1,s2;if(!(cin>>s1>>s2))return0;intstart=toMinutes(s1);intend=toMinutes(s2);intt1=0,t2=0,t3=0;intt2Limit=600;// 模拟计算for(inti=start;i<end;++i){if(isTier1(i)){t1++;}else{if(t2<t2Limit){t2++;}else{t3++;}}}cout<<"["<<t1<<","<<t2<<","<<t3<<"]"<<endl;return0;}

Go

packagemainimport("fmt""strings")// 将 HH:MM 转换为分钟functoMinutes(tstring)int{varh,mintfmt.Sscanf(t,"%d:%d",&h,&m)returnh*60+m}funcmain(){vars1,s2string// 读取两个时间字符串if_,err:=fmt.Scan(&s1,&s2);err!=nil{return}start:=toMinutes(s1)end:=toMinutes(s2)t1,t2,t3:=0,0,0t2Limit:=600// 逐分钟计费fori:=start;i<end;i++{// 判断是否在第一档时段if(i>=720&&i<810)||(i>=1050&&i<1080){t1++}else{// 第二档和第三档ift2<t2Limit{t2++}else{t3++}}}// 按照 [T1,T2,T3] 格式输出fmt.Printf("[%d,%d,%d]\n",t1,t2,t3)}

C语言

#include<stdio.h>/** * 将时间字符串 HH:MM 转换为总分钟数 */intto_minutes(char*t){inth,m;sscanf(t,"%d:%d",&h,&m);returnh*60+m;}intmain(){chars1[10],s2[10];// 读取开机和关机时间if(scanf("%s %s",s1,s2)!=2)return0;intstart=to_minutes(s1);intend=to_minutes(s2);intt1=0,t2=0,t3=0;intt2_limit=600;// 逐分钟累加计费时长for(inti=start;i<end;i++){// 第一档时段判断if((i>=720&&i<810)||(i>=1050&&i<1080)){t1++;}else{// 第二档及第三档判断if(t2<t2_limit){t2++;}else{t3++;}}}// 打印结果printf("[%d,%d,%d]\n",t1,t2,t3);return0;}

完整用例

用例1

8:00 23:30

用例2

13:00 17:45

用例3

12:00 13:30

用例4

0:00 10:00

用例5

12:00 12:00

用例6

20:00 23:59

用例7

11:59 12:01

用例8

17:29 18:01

用例9

0:00 23:59

用例10

13:30 17:30

文章目录

  • 计费时段计算
  • 题目描述
  • 输入描述
  • 输出描述
  • 示例1
  • 示例2
  • 解题思路
    • 核心思想
    • 复杂度分析
  • Java
  • Python
  • JavaScript
  • C++
  • Go
  • C语言
  • 完整用例
    • 用例1
    • 用例2
    • 用例3
    • 用例4
    • 用例5
    • 用例6
    • 用例7
    • 用例8
    • 用例9
    • 用例10

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 7:00:21

Real Anime Z效果对比:与SDXL-Refiner联用后真实系细节增强效果评估

Real Anime Z效果对比&#xff1a;与SDXL-Refiner联用后真实系细节增强效果评估 1. 工具介绍 Real Anime Z是基于阿里云通义Z-Image底座模型与Real Anime Z专属微调权重开发的高精度二次元图像生成工具。该工具专为真实系二次元风格优化&#xff0c;通过多项技术创新实现了高…

作者头像 李华
网站建设 2026/4/24 7:00:21

从AI到抗量子:下一代金融基础设施正在发生什么变化?

在过去几年中,金融科技行业的讨论焦点,经历了几次明显的转移:从区块链性能,到Web3应用,再到AI与自动化。而当这些技术逐渐交叉,一个更底层的问题开始浮现:来的金融系统,应该建立在什么样的基础之上?这不仅是技术问题,更是结构问题。一、AI正在改变的,不只是效率,而是“决策方式…

作者头像 李华
网站建设 2026/4/24 6:59:21

跨越 CRUD 内卷:半导体产业链与算力基建下的软件工程新生态

在留学生计算机科学&#xff08;CS&#xff09;与软件工程的求职圈中&#xff0c;长期存在着一种极度拥挤的路径依赖&#xff1a;大量的候选人涌入前端开发、移动端应用或是后端的增删改查&#xff08;CRUD&#xff09;业务线。随着全球互联网红利期的放缓以及 AI 代码生成工具…

作者头像 李华
网站建设 2026/4/24 6:54:17

AI老照片修复:Stable Diffusion与ControlNet实战指南

1. 老照片修复的艺术与技术作为一名长期从事数字图像修复的从业者&#xff0c;我见证了从传统Photoshop手动修复到AI智能修复的技术演进。老照片修复不仅仅是技术活&#xff0c;更是一种对历史的尊重和情感的延续。每张泛黄的老照片背后&#xff0c;都承载着独特的记忆和故事。…

作者头像 李华
网站建设 2026/4/24 6:50:28

乳腺癌生存预测模型开发与实践指南

1. 乳腺癌患者生存概率模型开发指南在临床医学研究中&#xff0c;预测患者生存概率一直是肿瘤学领域的核心课题。乳腺癌作为全球女性最常见的恶性肿瘤&#xff0c;其生存率预测对治疗方案选择、预后评估和医疗资源分配都具有重要意义。本文将系统介绍如何构建一个科学可靠的乳腺…

作者头像 李华
网站建设 2026/4/24 6:50:28

企业财务数字化转型:从RPA到AI Agent的落地路径

在企业数字化转型中&#xff0c;财务一直是最优先落地的场景之一。原因很现实&#xff1a;流程标准、数据集中、效果可量化。但也正因为“好做”&#xff0c;很多企业对财务自动化的理解&#xff0c;长期停留在一个比较初级的阶段&#xff0c;随着AI能力的引入&#xff0c;财务…

作者头像 李华