LeetCode.717 1比特与2比特字符

202 阅读2分钟

这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战

题目描述:

717. 1比特与2比特字符 - 力扣(LeetCode) (leetcode-cn.com)

有两种特殊字符。第一种字符可以用一比特0来表示。第二种字符可以用两比特(10 或 11)来表示。

现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。

示例一

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

示例二

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

提示:

  • 1 <= len(bits) <= 1000.
  • bits[i] 总是0 或 1.

思路分析

遍历

我们观察一下题目给的2个字符的特点,我们很容易就发现,两比特的字符一定是 1 开头的,所以当我们遍历到第i位的时候,发现bits[i] == 1,我们就要一次性跳过2个字符,因为后边不管是10还是11都要跳过,那如果bits[i] == 0,就说明这是一个一比特字符,所以我们跳过即可。

所以等我们遍历结束,我们看最后的步长是1还是2。

如果i==bits.length-1说明最后跳的步长是1,说明是一比特结尾。

如果i==bits.length 说明最后跳的步长是2,说明不是一比特结尾。

AC代码

class Solution {
    fun isOneBitCharacter(bits: IntArray): Boolean {
        var i = 0
        while(i < bits.size - 1){
            i += bits[i] + 1
        }
        return i == bits.size - 1
    }
}

总结

官解的贪心倒是没想到,下次可以尝试解答下。

参考

1 比特与 2 比特字符 - 1比特与2比特字符 - 力扣(LeetCode) (leetcode-cn.com)