题目描述
喊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);
}
}