携手创作,共同成长!这是我参与「掘金日新计划 · 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 <= 1000s[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道!!!!