Date:2019-4-14

题目地址:https://leetcode-cn.com/problems/student-attendance-record-i/

给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符:

  1. ‘A’ : Absent,缺勤
  2. ‘L’ : Late,迟到
  3. ‘P’ : Present,到场

如果一个学生的出勤记录中不超过一个’A’(缺勤)并且不超过两个连续的’L’(迟到),那么这个学生会被奖赏。
你需要根据这个学生的出勤记录判断他是否会被奖赏。
示例 1:

输入: “PPALLP” 输出: True

示例 2:

输入: “PPALLL” 输出: False

解题

从字符串中取判断是否有超过一个A和超过两个连续的LL的字符

  1. const checkRecord = (s) => {
  2. let sArr = s.split('')
  3. // 如果可以找到 字符串 A 的长度是否大于 1, 如果大于 1 直接跳出
  4. if (sArr.filter(item => item === 'A').length > 1) {
  5. return false
  6. }
  7. // 如果前两位或者后两位相等,也跳出
  8. if (
  9. sArr.find((item, index) => {
  10. return item === 'L' && (
  11. (item === sArr[index + 2] && item === sArr[index + 1]) ||
  12. (item === sArr[index - 2] && item === sArr[index - 1])
  13. )
  14. })
  15. ) {
  16. return false
  17. }
  18. // 如果都没有的话则返回 true
  19. return true
  20. };

更加简练的方式

const checkRecord = (s) => {
  // 直接取判断是否有LLL
  if(s.indexOf('LLL') > -1) {
    return false
  }
  // 判断A出现的次数,如果A出现了1次,那么A的位置不会发生改变,否则会发生改变
  return s.indexOf('A') === s.lastIndexOf('A')
}

为什么要做这道题,它的实际运用场景是什么

解决字符串内的条件筛选我们应该如何去做