有两种特殊字符。第一种字符可以用一比特0
来表示。第二种字符可以用两比特(10
或 11
)来表示。
现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。
示例 1:
输入: bits = [1, 0, 0] 输出: True 解释: 唯一的编码方式是一个两比特字符和一个一比特字符。所以最后一个字符是一比特字符。
示例 2:
输入: bits = [1, 1, 1, 0] 输出: False 解释: 唯一的编码方式是两比特字符和两比特字符。所以最后一个字符不是一比特字符。
注意:
1 <= len(bits) <= 1000
.bits[i]
总是0
或1
.
思路1:
想了半天,最后一个是0,前面如果有连续个单独的1,那么就false
class Solution {
public:
bool isOneBitCharacter(vector<int>& bits) {
string s;
for (int i=0;i<bits.size();i++)
s.append(to_string(bits[i]));
int ta_index=bits.size()-1;
int tmp=ta_index;
int count=0;
if(bits[ta_index-1]==0)//倒数第二个是0,直接返回true
return true;
else{
tmp=ta_index-1;
while(bits[tmp]==1)//倒数第二个是1,得看有几个连续的1
{
count++;
tmp--;
if(tmp<0)
break;
}
if(count%2==1)
return false;
}
return true;
}
};
思路2:
像这种让我笔试的时候,我是怎么都想不出来的。。。
作者:Cloudox_
链接:https://www.jianshu.com/p/6eea5377e7b4
來源:简书看到别人的一个方法,遍历一遍数组内容,遇到1则前进两步(因为1开头一定是包含两个比特的),遇到0则前进一步。遇到1则令结果变量为false,遇到0则令结果变量为true,也就是说,当遍历完时,如果最后走的一步恰好为遇到1时的两步,则返回为false,如果最后走的一步是遇到0时的一步,则返回为true。
class Solution {
public:
bool isOneBitCharacter(vector<int>& bits) {
bool c;
for (int i = 0; i < bits.size();) {
if (bits[i]) c = 0, i+=2;
else c = 1, ++i;
}
return c;
}
};
-
VS不能用to_string()
-
做题的时候不能用itoa。。。
-
字符串的查找
-
字符串与整数的互相转换
调试代码:
#include <iostream>
#include <vector>
#include <string.h>
#include <string>
#include <stdio.h>
using namespace std;
bool isOneBitCharacter(vector<int>& bits) {
string s;
for (int i=0;i<bits.size();i++)
{
char str[2];
itoa(bits[i],str,10);
s.append(str);
}
/*size_t found=s.rfind("10");
if (found!=string::npos)
cout<<found<<endl;*/
int ta_index=bits.size()-1;
int tmp=ta_index;
int count=0;
if(bits[ta_index-1]==0)
return true;
else{
tmp=ta_index-1;
while(bits[tmp]==1)
{
count++;
tmp--;
if(tmp<0)
break;
}
if(count%2==1)
return false;
}
return true;
}
int main()
{
int arr[4]={1,1,1,0};
vector<int> bits(arr,arr+4);
bool res=isOneBitCharacter(bits);
cout<<res<<endl;
return 0;
}