这是我参与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
}
}
总结
官解的贪心倒是没想到,下次可以尝试解答下。