持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
一、题目与题目分析
题目
如果一个二进制字符串,是以一些 0(可能没有 0)后面跟着一些 1(也可能没有 1)的形式组成的,那么该字符串是 单调递增 的。
给你一个二进制字符串 s,你可以将任何 0 翻转为 1 或者将 1 翻转为 0 。
返回使 s 单调递增的最小翻转次数。
(题目来源:力扣:926.将字符串翻转到单调递增)
题目分析
在了解题目前,需要懂这里的单调递增是什么意思;(单调递增:① 要么以1结尾,且出现的1都需要连续;② 要么全部为0.)
在理解了这里的单调递增后,再看例子叫比较清晰了解了。就是一串二进制的字符串,选择最少的翻转次数,使该字符串变成单调递增。
如给定一串二进制的字符串00100
那么,该最小的翻转次数就为1. 因为,在这里有① 和② 的两个处理方法;但事,很明显把1变成0,一次翻转次数即可;也就是最小翻转次数了~ 即变为00000比变为00111翻转次数更少。
二、整体逻辑与主要代码
题目分析已经比较清楚了,接下来我们进入代码设计。
整体逻辑
依据单调递增的两个方法:① 和 ②;首先,我们就需要一个统计所有的1的数量;一个动态统计最小的翻转次数;最后再对比一下所有1翻转的次数和统计出最小的翻译次数,求出最终答案~(说得可能比较笼统,可以直接跳过,看主要代码,可以跟着代码和比较详细的注释来结合着看。)
主要代码
整体逻辑清晰了之后,同时也有较清楚的注释。直接来看代码吧! (如有不懂的或者更好的建议,欢迎评论区分享友友的看法哈~)
class Solution {
// 假设有“00100”,countOne为1,第一轮,coutTurn为1,第二轮为2,第三轮为1,第四轮不变,第五轮还是不变。
public int minFlipsMonoIncr(String s) {
// 统计1一共的数量
int countOne = 0;
// 统计最小翻转的次数(同时记录0最小的翻转次数和1最小的翻转次数)
int countTurn = 0;
for (char ch : s.toCharArray()) { // 字符数组遍历
if (ch == '0') {
// 对比当前翻转0的次数和翻转1的次数
countTurn = Math.min(countTurn, countOne) + 1;
} else {
// 对比当前翻转1的次数和翻转0的次数
countTurn = Math.min(countTurn, countOne);
// 统计所有1
countOne++; // 这里需要注意,对比过后再+1给1的数量
}
}
// 需要如果存在0比较多的连续,需要再对比一次
return Math.min(countOne, countTurn);
}
}
三、结果展示
四、总结
最近,事事不顺心也不如意。只希望每个人都能顺心如意吧!愿世界美好!
题目数据库
Gitee:传送门
文章小尾巴
文章写作、模板、文章小尾巴可参考:《写作“小心思”》
感谢你看到最后,最后再说两点~
①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
我是南方者,一个热爱计算机更热爱祖国的南方人。
(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)