We have two special characters. The first character can be represented by one bit 0. The second character can be represented by two bits (10 or 11).

Now given a string represented by several bits. Return whether the last character must be a one-bit character or not. The given string will always end with a zero.

Example 1:

Input:
bits = [1, 0, 0]
Output: True
Explanation:
The only way to decode it is two-bit character and one-bit character. So the last character is one-bit character.

Example 2:

Input:
bits = [1, 1, 1, 0]
Output: False
Explanation:
The only way to decode it is two-bit character and two-bit character. So the last character is NOT one-bit character.

Note:

  • 1 <= len(bits) <= 1000.
  • bits[i] is always 0 or 1.

这道题说有两种特殊的字符,一种是两位字符,只能是二进制的11和10,另一种是单个位字符,只能是二进制的0。现在给了我们一个只包含0和1的数组,问我们能否将其正确的分割,使得最后一个字符是个单个位字符。这道题可以使用贪婪算法来做,因为两种字符互不干扰,只要我们遍历到了数字1,那么其必定是两位字符,所以后面一位也得跟着,而遍历到了数字0,那么就必定是单个位字符。所以我们可以用一个变量i来记录当前遍历到的位置,如果遇到了0,那么i自增1,如果遇到了1,那么i自增2,我们循环的条件是i < n-1,即留出最后一位,所以当循环退出后,当i正好停留在n-1上,说明最后一位是单独分割开的,因为题目中限定了最后一位一定是0,所以没必要再判断了,参见代码如下:

解法一:

class Solution {
public:
bool isOneBitCharacter(vector<int>& bits) {
int n = bits.size(), i = ;
while (i < n - ) {
if (bits[i] == ) ++i;
else i+= ;
}
return i == n - ;
}
};

下面这种解法写的更加简洁了,直接用一行代替了if..else..语句,相当巧妙,当bits[i]为0时,i还是相当于自增了1,当bits[i]为1时,i相当于自增了2,最后还是在循环跳出后检测i是否为n-1,参见代码如下:

解法二:

class Solution {
public:
bool isOneBitCharacter(vector<int>& bits) {
int n = bits.size(), i = ;
while (i < n - ) {
i += bits[i] + ;
}
return i == n - ;
}
};

下面我们来看递归解法,用的是回溯的思想,首先判断如果bits为空了,直接返回false,因为题目初始给的bits是非空的,在调用递归函数中为空了说明最后一位跟倒数第二位组成了个两位字符,所以不合题意返回false。再判断如果bits大小为1了,那么返回这个数字是否为0,其实直接返回true也行,因为题目中说了最后一个数字一定是0。然后我们新建一个数组t,如果bits的首元素为0,则我们的t赋值为去掉首元素的bits数组;如果bits的首元素是1,则我们的t服之为去掉前两个元素的bits数组,然后返回调用递归函数的结果即可,参见代码如下:

解法三:

class Solution {
public:
bool isOneBitCharacter(vector<int>& bits) {
if (bits.empty()) return false;
if (bits.size() == ) return bits[] == ;
vector<int> t;
if (bits[] == ) {
t = vector<int>(bits.begin() + , bits.end());
} else if (bits[] == ) {
t = vector<int>(bits.begin() + , bits.end());
}
return isOneBitCharacter(t);
}
};

下面这种解法也是用的递归,递归函数用的不是原函数,这样可以只用位置变量idx来遍历,而不用新建数组t,初始时idx传入0,在递归函数中,如果idx为n了,相当于上面解法中的bits数组为空了情况,返回false;如果idx为n-1,返回true;如果bits[idx]为0,则返回调用递归函数的结果,此时idx加上1;如果bits[idx]为1,则返回调用递归函数的结果,此时idx加上2,参见代码如下:

解法四:

class Solution {
public:
bool isOneBitCharacter(vector<int>& bits) {
return helper(bits, );
}
bool helper(vector<int>& bits, int idx) {
int n = bits.size();
if (idx == n) return false;
if (idx == n - ) return bits[idx] == ;
if (bits[idx] == ) return helper(bits, idx + );
return helper(bits, idx + );
}
};

类似题目:

Gray Code

参考资料:

https://discuss.leetcode.com/topic/108743/java-solution-1-or-2

https://discuss.leetcode.com/topic/108766/c-both-iterative-and-recursive-solutions

LeetCode All in One 题目讲解汇总(持续更新中...)

[LeetCode] 1-bit and 2-bit Characters 一位和两位字符的更多相关文章

  1. LeetCode算法题-1-bit and 2-bit Characters(Java实现)

    这是悦乐书的第302次更新,第321篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第170题(顺位题号是717).有两个特殊字符,第一个字符可以用一个比特0表示,第二个字 ...

  2. C++版- Leetcode 3. Longest Substring Without Repeating Characters解题报告

    Leetcode 3. Longest Substring Without Repeating Characters 提交网址: https://leetcode.com/problems/longe ...

  3. [LeetCode] 3.Longest Substring Without Repeating Characters 最长无重复子串

    Given a string, find the length of the longest substring without repeating characters. Example 1: In ...

  4. [LeetCode] 340. Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串

    Given a string, find the length of the longest substring T that contains at most k distinct characte ...

  5. 【LeetCode】717. 1-bit and 2-bit Characters 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcod ...

  6. [leetcode]159. Longest Substring with At Most Two Distinct Characters至多包含两种字符的最长子串

    Given a string s , find the length of the longest substring t  that contains at most 2 distinct char ...

  7. LeetCode初级算法--字符串02:字符串中的第一个唯一字符

    LeetCode初级算法--字符串02:字符串中的第一个唯一字符 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog. ...

  8. [LeetCode] Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子字符串

    Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...

  9. [LeetCode] Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串

    Given a string, find the length of the longest substring T that contains at most k distinct characte ...

随机推荐

  1. color 圆盘染色

    Color 圆盘染色 题目大意:给你一个圆盘,等分成n个扇形,有m种颜色,每两个相邻的扇形不能相交,求染色方案数. 注释:m,n<=$10^6$. 想法:这题是小圆盘染色的加强版(小圆盘染色?) ...

  2. React demo:express、react-redux、react-router、react-roter-redux、redux-thunk(二)

    上一篇杂七杂八说了下express部分的,现在开始进入正题. 接下去的顺序,就是项目从零开始的顺序(思路方向). [actions定义] 如图,目录页,有4部分的内容,所以以下几个actions是需要 ...

  3. 真是没想到,ikvm.net居然停止开发了。

    看样子作者对.net已经失去了信心 http://weblog.ikvm.net/CommentView.aspx?guid=33ea525f-a291-418a-bd6a-abdf22d0662b# ...

  4. Git详细教程(1)---个人Git的基本使用

    分布式版本控制系统--git 一.什么是Git 1.Git是什么 Git是目前世界上最先进的分布式版本控制系统(没有之一). 实际上版本控制系统有如下几个: 1) CVS 2)  SVN 3) Git ...

  5. 掌握这些回答技术面试题的诀窍,让你offer拿到手软。

    三.四月份,春回大地,万物复苏(请自带赵忠祥老师的BGM),又到了不少同学的跳槽时节. 最近一段时间团队也在招人,这期间筛选了不少简历,面试了一些候选人.这里谈谈我自己的对「怎样回答面试题」的理解. ...

  6. 乘法表(24.9.2017) (WARNING!!!!!!!!!!!)

    #include "stdio.h" main() { int i,j,result; printf("\n"); ;i<;i++) { ;j<;j ...

  7. 小草手把手教你 LabVIEW 串口仪器控制——VISA 串口配置

    建议大家按我发帖子的顺序来看,方便大家理解.请不要跳跃式的阅读.很多人现在看书,都跳跃式的看,选择性的看,导致有些细节的部分没有掌握到,然后又因为某个细节耽误很多时间.以上只是个人建议,高手可以略过本 ...

  8. JAVA中if多分支和switch的优劣性。

    Switch多分支语句switch语句是多分支选择语句.常用来根据表达式的值选择要执行的语句.例如,在某程序中,要求将输入的或是获取的用0-6代表的星期,转换为用中文表示的星期.该需求通过伪代码描述的 ...

  9. 13-TypeScript单例模式

    在JavaScript中,要实现设计模式比较复杂.而在TypeScript中因为使用面向对象的思想编程,要实现设计模式的方式与后端语言C#.Java等非常类似. 单例模式是一种常用的设计模式,通常用于 ...

  10. 70后.net老猿,尚能饭否?

    程序猿的大限 距离上一次主动找工作,快到5年了,到现在的东家,是差不多3年前猎头挖过来的,而当时东家刚刚被欧洲一家有百年历史的跨国企业集团收购,所以我也就有幸成了一名“外企员工”,但是集团保留原东家人 ...