集五福---哈希表

题目

集五福作为近年来大家喜闻乐见迎新春活动,集合爱国福、富强福、和谐福、友善福、敬业福即可分享超大红包。以 01 组成的长度为 5 的字符串代表每个人所得到的福卡,每一位代表一种福卡,1 表示已经获得该福卡,单类型福卡不超过 1 张,随机抽取一个小于 10 人团队,求该团队最多可以集齐多少套五福?

输入描述

输入若干个由01组成的长度等于5的字符串,代表团队中每个人福卡获得情况 注意1:1人也可以是一个团队 注意2:1人可以有05张福卡,但福卡不能重复

输出描述

输出该团队最多能凑齐多少套五福

输入

11101,10111

输出

1

思路

一共有五种不同的福卡,假设我们按照在长度等于5的字符串中的索引给这些福卡编号,即分别有0 1 2 3 4一共5种福卡。我们直接统计整个团队中,每种福卡的个数,而能够凑齐的福卡的套数,由数目最少的那一种福卡的数目来决定。

为了统计每一种福卡的个数,我们既可以使用哈希表来完成,也可以使用一个长度为5列表来完成。这两种计数方式没有本质区别。

代码

#include <iostream>
#include <sstream>
#include <vector>
#include <unordered_map>
//#include <limits.h>

using namespace std;

int main() {
    string line;
    getline(cin, line);
    istringstream iss(line);
    string person;
    vector<string> team;
    while (getline(iss, person, ',')) {
        team.push_back(person);
    }

    unordered_map<int, int> cnt;

    for (const string& person : team) {
        for (int i = 0; i < person.length(); i++) {
            if (person[i] == '1') {
                cnt[i]++;
            }
        }
    }

    if (cnt.size() < 5) {
        cout << 0 << endl;
    }
    else {
        int minCount = INT_MAX;
        for (const auto& kv : cnt) {
            minCount = min(minCount, kv.second);
        }
        cout << minCount << endl;
    }

    return 0;
}

时空复杂度

时间复杂度:O(N)。仅需一次遍历字符串数组。

空间复杂度:O(1)。无论是哈希表还是列表,长度最多为5,为常数级别空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值