3228. Maximum Number of Operations to Move Ones to the End
题目简介
/**
* @param {string} s
* @return {number}
*/
题目给我们一个由 0 与 1 组成的字符串 s
要求我们经过一系列操作使得所有的 1 都在字符串的结尾(右边)
操作包含:
- 寻找 s 中的子字符串
"10"将其中的 1 往右移直到碰到下一个 1 或者字符串结尾 - 举个例子:
s = "100001",我们选取子字符串"10"(s[0]与s[1]),移动后变成"000011"
题目要求我们返回最多需要操作几次才能把所有的 1 都移到结尾
解题思路
根据题意我们不难发现,要想让操作次数最多,我们只需要从字符串的左边往右边找就可以了
我们假设有这么一个字符串 s:"1001101"
首先我们遍历第一个元素 s[0] 是 1,所以我们要把它移到下一个 1 的前面,也就是下标为 2 的位置,这个需要一次操作
字符串目前变成了 "0011101",我们接下来要分别把最左边的三个 1 网右移到最后一个 1 前,需要 3 次操作
可以看出一个规律,把一串连续的 1 往右移,需要 1 的个数次操作
所以我们可以用一个变量 countOne 记录到目前为止 1 的个数,然后当我们遇到 0 的时候,我们就进行 countOne 次操作就可以了
Javascript
/**
* @param {string} s
* @return {number}
*/
var maxOperations = function (s) {
const len = s.length
let res = 0
let countOne = 0
let i = 0
while (i < len) {
if (s[i] === '0') {
while (i + 1 < len && s[i + 1] === '0') {
i++
}
res += countOne
} else {
countOne++
}
i++
}
return res
};