[杨小白]_leetcode_第85场双周赛-第二题2380. 二进制字符串重新安排顺序需要的时间

145 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

第85场双周赛-力扣

第85场双周赛-力扣

啊真是服了,1,2题合起来十分钟就ac了,第三题一直超时,也意识到问题了,最后想到了解决方法,做完提交的时候已经12点01了,差点三题选手。

2380. 二进制字符串重新安排顺序需要的时间

给你一个二进制字符串 s 。在一秒之中,所有 子字符串 "01" 同时 被替换成 "10" 。这个过程持续进行到没有 "01" 存在。

请你返回完成这个过程所需要的秒数。

示例 1

  • 输入:s = "0110101"
  • 输出:4
  • 解释:
  • 一秒后,s 变成 "1011010" 。
  • 再过 1 秒后,s 变成 "1101100" 。
  • 第三秒过后,s 变成 "1110100" 。
  • 第四秒后,s 变成 "1111000" 。
  • 此时没有 "01" 存在,整个过程花费 4 秒。
  • 所以我们返回 4 。

示例 2

  • 输入: s = "11100"
  • 输出: 0
  • 解释:
  • s 中没有 "01" 存在,整个过程花费 0 秒。
  • 所以我们返回 0 。

提示:

  • 1 <= s.length <= 1000
  • s[i] 要么是 '0' ,要么是 '1' 。

进阶:

你能以 O(n) 的时间复杂度解决这个问题吗?

2.解法

class Solution {
    public int secondsToRemoveOccurrences(String s) {
        if(s.length()==1) return 0;
        int res = 0;
        char[] chars = s.toCharArray();
        int num = 0;
        while(true) {
            for(int i = 0; i < chars.length - 1; i++) {
                if(chars[i]=='0'&&chars[i+1]=='1') {
                    chars[i] = '1';
                    chars[i+1] = '0';
                    num = 1;
                    i++;
                }
            }         
            if(num==1) {
                res++;
                num = 0;
            }else {
                break;
            }
        }
        return res;
    }
}

解析

这个题,数据量不大,可以用暴力解决,O(n)的解法确实没有想出来。

首先最简单的解法肯定是直接调用contains和replace的api来做。

这里其实也是类似,从头遍历找到10改变为01,如果有找到10并发生改变,那就将一个用来记录的变量num置1,知道不包含10,就break跳出循环即可。

第一题链接如下

[杨小白]_leetcode_第85场双周赛-第一题2379. 得到 K 个黑块的最少涂色次数

第三题链接如下

[杨小白]_leetcode_第85场双周赛-第三题2381. 字母移位 II

3.结束

这个题作为第二题,没什么难度,就暴力就完事,难怪我10分钟就ac了前两道题,gogogo,刷题刷题,每天一道,三年1000道!!!!