01串修改

给定一个只包含'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;
}

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/17000346.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(244)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起