返回介绍

solution / 2900-2999 / 2938.Separate Black and White Balls / README

发布于 2024-06-17 01:02:58 字数 3082 浏览 0 评论 0 收藏 0

2938. 区分黑球与白球

English Version

题目描述

桌子上有 n 个球,每个球的颜色不是黑色,就是白色。

给你一个长度为 n 、下标从 0 开始的二进制字符串 s,其中 10 分别代表黑色和白色的球。

在每一步中,你可以选择两个相邻的球并交换它们。

返回「将所有黑色球都移到右侧,所有白色球都移到左侧所需的 最小步数」。

 

示例 1:

输入:s = "101"
输出:1
解释:我们可以按以下方式将所有黑色球移到右侧:
- 交换 s[0] 和 s[1],s = "011"。
最开始,1 没有都在右侧,需要至少 1 步将其移到右侧。

示例 2:

输入:s = "100"
输出:2
解释:我们可以按以下方式将所有黑色球移到右侧:
- 交换 s[0] 和 s[1],s = "010"。
- 交换 s[1] 和 s[2],s = "001"。
可以证明所需的最小步数为 2 。

示例 3:

输入:s = "0111"
输出:0
解释:所有黑色球都已经在右侧。

 

提示:

  • 1 <= n == s.length <= 105
  • s[i] 不是 '0',就是 '1'

解法

方法一:计数模拟

我们考虑将所有的 $1$ 移到最右边,用一个变量 $cnt$ 记录当前已经移动到最右边的 $1$ 的个数,用一个变量 $ans$ 记录移动的次数。

我们从右往左遍历字符串,如果当前位置是 $1$,那么我们将 $cnt$ 加一,同时将 $n - i - cnt$ 加到 $ans$ 中,其中 $n$ 是字符串的长度。最后返回 $ans$ 即可。

时间复杂度 $O(n)$,其中 $n$ 是字符串的长度。空间复杂度 $O(1)$。

class Solution:
  def minimumSteps(self, s: str) -> int:
    n = len(s)
    ans = cnt = 0
    for i in range(n - 1, -1, -1):
      if s[i] == '1':
        cnt += 1
        ans += n - i - cnt
    return ans
class Solution {
  public long minimumSteps(String s) {
    long ans = 0;
    int cnt = 0;
    int n = s.length();
    for (int i = n - 1; i >= 0; --i) {
      if (s.charAt(i) == '1') {
        ++cnt;
        ans += n - i - cnt;
      }
    }
    return ans;
  }
}
class Solution {
public:
  long long minimumSteps(string s) {
    long long ans = 0;
    int cnt = 0;
    int n = s.size();
    for (int i = n - 1; i >= 0; --i) {
      if (s[i] == '1') {
        ++cnt;
        ans += n - i - cnt;
      }
    }
    return ans;
  }
};
func minimumSteps(s string) (ans int64) {
  n := len(s)
  cnt := 0
  for i := n - 1; i >= 0; i-- {
    if s[i] == '1' {
      cnt++
      ans += int64(n - i - cnt)
    }
  }
  return
}
function minimumSteps(s: string): number {
  const n = s.length;
  let [ans, cnt] = [0, 0];
  for (let i = n - 1; ~i; --i) {
    if (s[i] === '1') {
      ++cnt;
      ans += n - i - cnt;
    }
  }
  return ans;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文