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;
}
posted @ 2022-12-23 11:32  YaosGHC  阅读(284)  评论(0)    收藏  举报