Skip to content

551. 学生出勤记录 I

解题过程

INFO

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

'A':Absent,缺勤 'L':Late,迟到 'P':Present,到场 如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:

按 总出勤 计,学生缺勤('A')严格 少于两天。 学生 不会 存在 连续 3 天或 连续 3 天以上的迟到('L')记录。 如果学生可以获得出勤奖励,返回 true ;否则,返回 false

javascript
/**
 * @link https://leetcode.cn/problems/student-attendance-record-i/
 * @title 551. 学生出勤记录 I
 * @description 给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:
 * 'A':Absent,缺勤
 * 'L':Late,迟到
 * 'P':Present,到场
 * 如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:
 * 按 总出勤 计,学生缺勤('A')严格 少于两天。
 * 学生 不会 存在 连续 3 天或 连续 3 天以上的迟到('L')记录。
 * 如果学生可以获得出勤奖励,返回 true ;否则,返回 false
 * @param {string} s
 * @return {boolean}
 */
// 解法一
// 思路:通过切割A和L字符统计数组长度判断即可
var checkRecord = function (s) {
  return s.split('A').length <= 2 && s.split('LLL').length < 2
}

// 解法二
// 思路:循环遍历累计法,直接遍历统计字符次数即可
var checkRecord = function (s) {
  let absentCount = 0
  let lateCount = 0

  for (let i = 0; i < s.length; i++) {
    if (s[i] === 'A') {
      absentCount++
      if (absentCount === 2) {
        return false
      }
    }

    if (s[i] === 'L') {
      lateCount++
      if (lateCount === 3) {
        return false
      }
    } else {
      lateCount = 0
    }
  }

  return true
}

// 解法三
// 思路:正则表达式匹配字符即可
var checkRecord = function (s) {
  return (s.match(/A/g)?.length || 0) < 2 && (s.match(/LLL/g)?.length || 0) === 0
}

// 解法四
// 思路:利用字符串搜索指定字符首尾查询索引位置和判断指定字符是否存在即可
var checkRecord = function (s) {
  return s.indexOf('A') === s.lastIndexOf('A') && !s.includes('LLL')
}

// 解法五
// 思路:来自 Java 题解的思路,执行效果在 Java 秒杀 99% 的人,好奇试试,但 JavaScript 并没有他本人说的那么好可能跟变成语言有关吧
var checkRecord = function (s) {
  return s.indexOf('LLL') < 0 && s.split('A').length <= 2
}

// const result = checkRecord('PPALLP') // true
const result = checkRecord('PPALLL') // false
console.log(result)

解题感受

今晚的解题状态挺不错的,虽然只写出了 4 种解法。但是答题的思路很好,看到题目就知道该用什么方法来做,脑子里也大概知道哪种解法执行效果最好了,相对来说做题这么久是感觉到一丢点进步,继续加油。发现保持每天一道题真的可以让自己的脑子写代码保持一定的编程能力,得心应手不敢说,至少思路和上手写代码越来越顺了

优质题解