荣耀机试

岗位:(无线通信协议工程师)

题一和题二easy,不再赘述了~

P3:1702. 修改后的最大二进制字符串

【解题思路】贪心思路,00->10是将数字变大,10->01可以将1右移,因此可以将比特流转换为左1中间0右边1的情况。主要思路是计算出最后一个0所在的位置begin+cnt-1,其中begin是指第一个0出现的位置,cnt是指0出现的次数。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string maximumBinaryString(string binary) {
int n=binary.length();
bool flag=false;
int cnt=0,index=1e6;
for(int i=0;i<n;i++)
{
if(binary[i]=='0'){
cnt++;
index=min(index,i);
}
}
if(cnt<2) return binary;
string ans(n,'1');
ans[index+cnt-1]='0'; // 00->
return ans;
}