T1.小红的字符串 - 饿了么

饿了么

题目描述

小红拿到了一个01串s。她将进行恰好一次以下操 作:

选择下标 i,j(i≠j),交换s[i]和s[j]。

小红想知道,不同的操作方案,最终能生成多少不 同的字符串?

输入描述

一个仅由'0'和'1'构成的字符串。字符串长度不小于2,不大于200000。

输出描述

一个整数,代表最终的方案数。

示例1

输入:
1100

输出:
5

说明:
共有以下5种不同字符串:
交换第一个和第二个字符,形成1100
交换第二个和第三个字符,形成1010
交换第二个和第四个字符,形成1001
交换第一个和第三个字符,形成0110
交换第一个和第四个字符,形成0101

C++


#include <bits/stdc++.h>

using namespace std;

int main() {
    string s;
    cin >> s;
    long long ans = 1; // 当前字符串算一个
    int cnt0 = 0, cnt1 = 0;
    for (char ch: s) {
        // 当前的 ‘0' 和之前的 '1' 交换可以形成新的字符串
        if (ch == '0') {
            ans += cnt1;
            cnt0++;
        } else { // 当前的 ‘1' 和之前的 '0' 交换可以形成新的字符串
            ans += cnt0;
            cnt1++;
        }
    }

    cout << ans << endl;

    return 0;
}


题目类型

本题属于 贪心 + 计数 相关的算法题,主要涉及字符串操作和组合计数的思想。

解题思路

  1. 问题分析
    • 给定一个 01 字符串 s,允许交换 s[i]s[j] (i≠j),求能得到的不同字符串数目。
    • 本质上,每次交换都是让 01 互换位置,因此不同的交换方式只与 01 的相对数量有关,而与字符串的具体排列无关。
  2. 贪心 + 计数方法
    • 统计字符串 s01 的个数,分别记为 cnt0cnt1
    • 初始状态下,原始字符串本身就是一种情况。
    • 遍历字符串时:
      • 如果当前字符是 '0',那么它可以和之前出现的所有 '1' 进行交换,每次交换都会形成一个新的字符串,因此方案数增加 cnt1(之前出现的 1 的个数)。
      • 如果当前字符是 '1',那么它可以和之前出现的所有 '0' 进行交换,每次交换都会形成一个新的字符串,因此方案数增加 cnt0(之前出现的 0 的个数)。
    • 通过遍历一次字符串,我们就可以统计所有可能的交换方案数。

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

#春招##校招##面经##C++##笔试#
C++笔试真题题解 文章被收录于专栏

笔试真题题解

全部评论
count(0) * count(1) + 1 这样对吗? count(0)、count(1)分别是s中0和1的个数
点赞 回复 分享
发布于 03-14 15:23 上海

相关推荐

03-12 20:36
已编辑
门头沟学院 Java
deacky:就a了个第一题 思路基本是用一个数组记录给的数组每两天之间的 天数差再-1 然后k-n 为余量天数 把差值数组排序后 遍历 值小于余量天数就减掉 不小于的用cnt记一个数 最后输出2+cnt*2
投递小米集团等公司8个岗位 小米求职进展汇总
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务