华为 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; } } } }