刷题的日常-生成交替二进制字符串的最少操作数

82 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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);
    }
}

image.png