华为 8.03笔试 码流等分思路 过了25 复盘
题目:码流等分
#华为笔试#
二进制码流(字符串),将该码流切分成3段,每一段都得到相同的二进制值。
例如:输入为1010010,可以切分为10 10 010这三段,都表示十进制中的2。如果无法做到,则输入-1。如果码流全部为0,则视为无法做到,输出-1
示例输入:100101000001001010000100101
示例输出:100101 00000100101 0000100101
主要是思路就是切成三个子串,同时将前导0过滤,然后转换为十进制数判断相等
#include<iostream>
#include<vector>
using namespace std;
int bit = 1;
int retNum(string str) {
int result = 0;
for (int i = 0; i < str.length(); ++i) {
result = result << 1;
if (str[i] == '1') {
result = result | bit;
}
}
return result;
}
int main()
{
string str;
cin >> str;
int err = 0;
int len = str.length();
bool flag=false;
for (int i = 0; i < len; i++) { //特例 字符串全是0
if (str[i] == '1') {
err = err | bit;
}
}
if (err == 0) {
cout << -1 << endl;
}
else {
for (int i = 1; i < len; i++) {
for (int j = i + 1; j < len; j++) {
string str1 = str.substr(0, i);
string str2 = str.substr(i, j - i);
string str3 = str.substr(j, len - j);
if (retNum(str1) == retNum(str2) && retNum(str2) == retNum(str3)) {
flag = true;
cout << str1 << " " << str2 << " " << str3 << " " << endl;
break;
}
}
if (!flag && i == len - 1) { //这个很关键 主要是判断存在1但切割3次后仍然不满足要求的情况 如:0110
cout << -1 << endl;
}
}
}
} 