华为OD机试 - 喊7的次数重排 (c++)

喊7的次数重排

时间限制:1秒 | 内存限制:262144K | 语言限制:不限

题目描述:

喊7是一个传统的聚会游戏,N个人围成一圈,按顺时针从1到N编号。编号为1的人从1开始喊数,下一个人喊的数字为上一个人的数字加1,但是当将要喊出来的数字是7的倍数或者数字本身含有7的话,不能把这个数字直接喊出来,而是要喊"过"。假定玩这个游戏的N个人都没有失误地在正确的时机喊了"过",当喊到数字K时,可以统计每个人喊"过"的次数。

现给定一个长度为N的数组,存储了打乱顺序的每个人喊"过"的次数,请把它还原成正确的顺序,

示例1(代表3个参与,其中一个人喊了1次过,另2个人没有喊过)

输入

0 1 0

输出

1 0 0

示例2 (代表5个人参与,其中1个人喊了2次过,1个喊了1次过,另外3个人没喊过)

输入

0 0 0 2 1

输出

0 2 0 1 0

示例3

输入 (代表7个人参与,其中1个人喊了6次过,3个人各喊了一次过,另外3个人没有喊过)

0 0 0 6 1 1 1

输出

0 1 1 0 0 1 6

代码:

#include <iostream>
#include <string>
#include <vector>
#include <sstream>

using namespace std;

bool Is7(int n)
{
    if (n % 7 == 0)
    {
        return true;
    }
    string str = to_string(n);
    for (int i = 0; i < str.size(); i++)
    {
        if (str[i] == '7')
        {
            return true;
        }
    }

    return false;
}

int main()
{
    string str;
    getline(cin, str);
    vector<int> vec;
    string tmp;
    stringstream ss(str);
    while (getline(ss, tmp, ' '))
    {
        vec.push_back(atoi(tmp.c_str()));
    }

    int n7 = 0; // 喊过的总数
    for (auto tmp : vec)
    {
        n7 += tmp;
    }
    int persons = vec.size(); // 人数
    vector<int> v(persons + 1); // 从索引1开始保存有效值
    int nb = 1; // 从1开始喊
    while (n7 > 0)
    {
        if (Is7(nb))
        {
            int index = nb% persons; // 喊过的人索引
            if (index == 0)
            {
                index = persons;
            }
            v[index]++;
            n7--;
        }
        nb++;
    }
    for (int i = 1; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    return 0;
}

输入

0 1 0

预期输出

1 0 0 

实际输出

输入

0 0 0 2 1

预期输出

0 2 0 1 0

实际输出

输入

0 0 0 6 1 1 1

预期输出

0 1 1 0 0 1 6

实际输出

输入

1 1 1 1 2 2 2 3

预期输出

3 1 2 1 2 1 2 1

实际输出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值