3228. Maximum Number of Operations to Move Ones to the End

Leetcode link

题目简介

/**
 * @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
};

results matching ""

    No results matching ""