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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步