题目描述

喊7 是一个传统的聚会游戏,N个人围成一圈,按顺时针从1-7编号。

编号为1的人从1开始喊数,下一个人喊得数字是上一个人喊得数字+1。

但是当将要喊出数字7的倍数或者含有7的话,不能喊出 而是要喊过。

假定N个人都没有失误。当喊道数字k时,可以统计每个人喊 “过"的次数。

现给定一个长度n的数组,存储打乱的每个人喊”过"的次数,请把它还原成正确顺序,即数组的第i个元素存储编号i的人喊“过“的次数。

输入描述

输入为1行,空格分割的喊过的次数, 注意k并不提供,k不超过200,数字个数为n。

输出描述

输出为1行,顺序正确的喊过的次数 空格分割。

示例1

输入

0 1 0

输出

1 0 0

说明:只有一次过,发生在7,按顺序编号1的人遇到7  所以1 0 0,结束时的k不一定是7 也可以是 8 9, 喊过都是1 0 0。

示例2

输入

0 0 0 2 1

输出

0 2 0 1 0

说明:一共三次喊过,发生在7 14 17,编号为2 的遇到7 17,编号为4 的遇到14。

思路分析

  • 输入个数n就是参与人数
  • 编号为1的人从1开始喊数,下一个人喊得数字是上一个人喊得数字+1
  • 数字7的倍数或者含有7,喊过。
  • N个人都没有失误,即所有人都没有失误,都正确的根据规则喊了。
  • k并不提供,k不超过200。

参考代码

注:题目网上找的,参考代码是练习用,仅供参考,并不保证用例通过率。

import java.util.Scanner;

/**
 * 喊7游戏
 */
public class Test0016 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] timesStr = scanner.nextLine().split(" ");

        // 计算所有人喊过的总次数
        int totalTimes = 0;
        for (String s : timesStr) {
            totalTimes += Integer.parseInt(s);
        }

        // 初始化每个人喊过的次数的数组容器
        int[] times = new int[timesStr.length];

        // 遍历数字,i最大值大于200
        int count = 0;
        int peopleNum;
        for (int i = 1; i < 300; i++) {
            // 当前喊出数字7的倍数或者含有7
            if (i % 7 == 0 || String.valueOf(i).contains("7")) {
                count++;

                // 计算当前是第几个人喊得
                peopleNum = i % timesStr.length;

                // 当前的人,喊过的次数加1
                // 人是从1开始,所以对应数组下表要减1
                times[peopleNum - 1] += 1;

                // 达到次数结束掉
                if (count == totalTimes) {
                    break;
                }
            }
        }

        // 输出结果
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < times.length; i++) {
            stringBuilder.append(times[i]);
            if (i < times.length - 1) {
                stringBuilder.append(" ");
            }
        }
        System.out.println(stringBuilder);
    }
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐