开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情
刷题的日常-2022年11月29号
一天一题,保持脑子清爽
生成交替二进制字符串的最少操作数
来自leetcode的 1758 题,题意如下:
给你一个仅由字符 '0' 和 '1' 组成的字符串 s 。一步操作中,你可以将任一 '0' 变成 '1' ,或者将 '1' 变成 '0' 。
交替字符串 定义为:如果字符串中不存在相邻两个字符相等的情况,那么该字符串就是交替字符串。例如,字符串 "010" 是交替字符串,而字符串 "0100" 不是。
返回使 s 变成 交替字符串 所需的 最少 操作数。
示例1:
输入: s = "0100"
输出: 1
解释: 如果将最后一个字符变为 '1' ,s 就变成 "0101" ,即符合交替字符串定义。
理解题意
通过题意,我们可以将信息整理如下:
- 题目给出一个字符串,字符串是由 '0' 和 '1' 两种字符构成
- 现在要求我们对字符串进行翻转,让 '0' 和 '1' 交替出现
- 返回最少的翻转次数
做题思路
又是简单题,开心。从题目来看,只有两种字符,所以最终的翻转结果只会是 '0' 或者是 '1' 开头的字符串,我们只需要统计以'0'开头 或者是以 '1' 开头的字符串的翻转次数,然后返回这两个字符串中翻转次数最少的即可,步骤如下:
- 开辟一个变量 o 用来保存当前的交替字符是什么
- 另外需要有两个统计变量用来保存翻转结果
- 循环字符串中的字符
- 判断当前的字符 和 预期的字符是否有差异,有差异的字符需要增加翻转次数
- 最后返回最小的翻转结果
代码实现
代码实现如下:
public class Solution {
public int minOperations(String s) {
int o = 0;
int oCnt = 0, zCnt = 0, c;
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i) - '0';
if (c == o) {
zCnt++;
} else {
oCnt++;
}
o ^= 1;
}
return Math.min(oCnt, zCnt);
}
}