给定一个只包含'0'和'1'两种字符的字符串,每次操作可以选择相邻的两个字符,将它们同时变成'0'或者同时变成'1'。
请问最少多少次操作后,所有的字符都相同?
输入例子:
"1001101"
输出例子:
2
很明显是改成全1字符串或者全0字符串,但是究竟改哪个呢?不知道,都改一遍,取操作次数少的那个
当然并不是真的执行修改操作,否则就不能重复计数了
对于一个连续0/1段,操作次数是:字段长度/2(向上取整)
如何向上取整呢?可以使用
ceil()
函数,也可以自行实现
比如这里就是一个更巧妙的写法
for(i=0;i<n;i++){
if(str[i]==c)res++;
else res=0;
if(res&1)ans++; //等价于向上取整。当连续段长度为奇数时计数。
}
以下是本人的答案
int minOperations(string str) {
int count, res = 501;
double len;
// 这个循环很有意思,不仅是循环两次,更是用到了每次循环的字符
for (char ch = '0'; ch <= '1'; ch++) {
count = 0,len=0.0;
for (char cha : str) {
if (cha == ch) len++;
else {
if (len != 0) {
// 这里如果是int/2会出现结果为0的情况
count += ceil(len / 2.0);
len = 0;
}
}
}
if (len != 0) count += ceil(len / 2.0);// 处理结尾剩下的部分
res = min(res, count);
}
return res;
}
标签:字符,ch,int,修改,01,字符串,操作
From: https://www.cnblogs.com/yaocy/p/17000346.html