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

LeetCode: 551. 学生出勤记录 I

551. 学生出勤记录 I

原题

给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:

  • 'A':Absent,缺勤
  • 'L':Late,迟到
  • 'P':Present,到场

如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:

  • 总出勤 计,学生缺勤('A'严格 少于两天。
  • 学生 不会 存在 连续 3 天或 连续 3 天以上的迟到('L')记录。

如果学生可以获得出勤奖励,返回 true ;否则,返回 false

示例 1:

输入:s = "PPALLP"
输出:true
解释:学生缺勤次数少于 2 次,且不存在 3 天或以上的连续迟到记录。

示例 2:

输入:s = "PPALLL"
输出:false
解释:学生最后三天连续迟到,所以不满足出勤奖励的条件。

提示:

  • 1 <= s.length <= 1000
  • s[i]'A''L''P'
class Solution {public boolean checkRecord(String s) {}
}

解题思路

  1. 创建两个计数器:缺勤天数和连续迟到天数。
  2. 遍历字符数组:
    • 如果缺勤天数少于 2 且连续迟到天数少于 3,则继续执行。
    • 如果是出勤(‘P’),重置连续迟到天数为 0。
    • 如果是迟到(‘L’),连续迟到天数加 1。
    • 如果是缺勤(‘A’),重置连续迟到天数为 0,增加缺勤天数。
    • 如果缺勤天数大于等于 2 或连续迟到天数大于等于 3,则返回 false

代码示例

class Solution {public boolean checkRecord(String s) {// 将字符串转换成字符数组char arr[] = s.toCharArray();// 记录缺勤的天数int absentCount = 0;// 记录连续迟到的天数int continuousLateCount = 0;// 一次遍历整个字符数组for (char ch : arr) {// 缺勤次数少于 2 且连续迟到次数少于 3 才执行if (absentCount < 2 && continuousLateCount < 3) {if (ch == 'P') {// 遇到非迟到的出勤记录清空「连续迟到」的计数continuousLateCount = 0;} else if (ch == 'L') {// 连续迟到天数的计数加 1continuousLateCount += 1;} else {// 遇到非迟到的出勤记录清空「连续迟到」的计数continuousLateCount = 0;// 缺勤天数加 1absentCount += 1;}} else {return false;}}return absentCount < 2 && continuousLateCount < 3;}
}

注意

整个字符数组遍历完成之后不能直接 return true,考虑诸如 s = "PPALLL"s = "LLLAA"的情况,最后一个字符为 LA,刚好达到连续三天迟到或者两天缺勤,此时 if 判断 if (absentCount < 2 && continuousLateCount < 3) 不会再被执行,因此要再一次进行判断后返回。

优化

使用字符索引代替字符数组

从空间复杂度的角度来考虑,char arr[] = s.toCharArray() 将字符串转换成字符数组需要额外的内存开销。可以修改成如下代码,直接根据字符的索引来迭代:

class Solution {public boolean checkRecord(String s) {// ...// 根据字符的索引迭代for (int i = 0; i < s.length(); i++) {// 获取字符char ch = s.charAt(i);if (absentCount < 2 && continuousLateCount < 3) {if (ch == 'P') {// ...}}}return absentCount < 2 && continuousLateCount < 3;}
}

使用字符串方法 contains() 减少手动计数的开销

直接对字符串调用 contains() 方法来判断是否存在连续三天的迟到情况,即 s.contains("LLL"),删去多余手动记录连续迟到天数的内存开销。

class Solution {public boolean checkRecord(String s) {// 记录缺勤的天数int absentCount = 0;// 判断缺勤天数是否大于 2for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == 'A' && ++absentCount > 1) {return false;}}// 判断是否出现连续三天迟到的情况return !s.contains("LLL");}
}
说明

if (s.charAt(i) == 'A' && ++absentCount > 1)

  • 遇到字符 As.charAt(i) == 'A' 条件成立,继续执行后面的判断。++absentCount 会先执行递增操作,然后与 1 进行比较,简化了代码。

  • 遇到非字符 As.charAt(i) == 'A' 条件不成立,&& 逻辑与运算符直接短路,将不会执行第二个操作数。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【JavaScript】jQuery的使用
  • 【区块链 + 物联网】长虹智能家居跨平台互联方案 | FISCO BCOS应用案例
  • 安装 rocky9.4
  • PADS提示subnet #1 of gnd 20240902
  • js控制滚轮横向滚动
  • STM32——看门狗(独立/窗口)
  • 安装包丨WebGIS开发环境搭建及所需工具
  • 在VBA中,对Excel单元格的操作方法 (qo+op)
  • 学习之git的常用命令
  • [Algorithm][综合训练][kotori和n皇后][取金币][矩阵转置]详细讲解
  • css实现卡片右上角的状态
  • 【Linux】Linux命令行大冒险:寻找、搜索与压缩的神奇之旅
  • 培训第四十一天(docker-compose一键部署项目,haproxy容器代理多个web或java容器)
  • mysql学习教程,从入门到精通,MySQL数据类型基础教程(4)
  • 若依框架(前后端分离)增加手机号验证码登录
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【译】理解JavaScript:new 关键字
  • 2017年终总结、随想
  • Angular6错误 Service: No provider for Renderer2
  • Hibernate【inverse和cascade属性】知识要点
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • javascript从右向左截取指定位数字符的3种方法
  • MobX
  • mysql中InnoDB引擎中页的概念
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Spring核心 Bean的高级装配
  • uva 10370 Above Average
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 算法---两个栈实现一个队列
  • 微信小程序开发问题汇总
  • 小试R空间处理新库sf
  • 一天一个设计模式之JS实现——适配器模式
  • 数据可视化之下发图实践
  • 移动端高清、多屏适配方案
  • #include
  • #大学#套接字
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (苍穹外卖)day03菜品管理
  • (二)WCF的Binding模型
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot教学评价 毕业设计 641310
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (新)网络工程师考点串讲与真题详解
  • (源码分析)springsecurity认证授权
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET Core 中的路径问题
  • .Net Core 中间件验签
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复