leetcode刷题记录-717. 1比特与2比特字符

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

前言

今日的题目为简单题,只需要简单的模拟遍历就能够完成题目,并且还提供了另一种从尾部遍历的数学解法,在特定情况下不需要遍历完整个数组。

每日一题

今天的每日一题 717. 1比特与2比特字符,难度为简单

  • 有两种特殊字符:

  • 第一种字符可以用一个比特 0 来表示

  • 第二种字符可以用两个比特(10 或 11)来表示、

  • 给定一个以 0 结尾的二进制数组 bits ,如果最后一个字符必须是一位字符,则返回 true 。

 

示例 1:

输入: bits = [1, 0, 0]
输出: true
解释: 唯一的编码方式是一个两比特字符和一个一比特字符。
所以最后一个字符是一比特字符。
复制代码

示例 2:

输入: bits = [1, 1, 1, 0]
输出: false
解释: 唯一的编码方式是两比特字符和两比特字符。
所以最后一个字符不是一比特字符。

复制代码

提示:

1 <= bits.length <= 1000 bits[i] == 0 or 1

题解

简单模拟

这道题最简单的解法就是直接遍历整个数组,因为我们会碰到两种情况:

  1. 以 0 为开头,说明是一个比特 0 的情况,直接将答案改为true并且执行下一项

  2. 以 1 为开头,说明是两个比特的情况,将答案改为false并且设定一个标记,表示下一项需要跳过,然后执行下一项

在循环遍历完整个数组之后,就能够得到答案的值,这就是题目要求的最后一位的情况。

/**
 * @param {number[]} bits
 * @return {boolean}
 */
var isOneBitCharacter = function (bits) {
  let ans = 0,
    n = bits.length;
  let isTwo = 0;
  for (let i in bits) {
    if (isTwo == 1) {
      isTwo = 0;
      continue;
    }
    if (bits[i] == 0) {
      ans = 1;
      continue;
    }
    if (bits[i] == 1) {
      ans = 0;
      isTwo = 1;
      continue;
    }
  }
  return ans;
};
复制代码

image.png

逆序解法

题目还有另外的一种思路,在特定情况下并不一定需要循环遍历完整个数组。

  1. 首先要满足题目的要求,那么最后一位必须得是 0

  2. 然后我们可以从尾部去向前遍历,直到找到第二个 0

  3. 接着只要去判断第二个0 之后的数组长度是奇数还是偶数,如果是奇数,那说明最后一位一定是 一比特 0 ,返回true,反之一定是 二比特 10 ,返回false。 可以看一下下图做一个理解。

image.png

/**
 * @param {number[]} bits
 * @return {boolean}
 */
var isOneBitCharacter = function (bits) {
  let n = bits.length;
  if (bits[n - 1] == 1) {
    return false;
  } else if (n == 1) {
    return true;
  } else {
    let long = 1;
    for (i = n - 2; i >= 0; i--) {
      if (bits[i] == 0) {
        if (long % 2 == 1) {
          return true;
        } else {
          return false;
        }
      }
      long = long + 1;
    }
    return n % 2;
  }
};
复制代码

image.png

Guess you like

Origin juejin.im/post/7066631458265235492