【算法题】喊7的次数重排

671次阅读
没有评论

共计 1146 个字符,预计需要花费 3 分钟才能阅读完成。

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 喊7是一个传统的聚会游戏,N个人围成一圈,按顺时针从1到N编号。
 * 编号为1的人从1开始喊数,下一个人喊的数字为上一个人的数字加1,但是当将要喊出来的数字是7的倍数或者数字本身含有7的话,不能把这个数字直接喊出来,而是要喊"过"。
 * 假定玩这个游戏的N个人都没有失误地在正确的时机喊了"过",当喊到数字K时,可以统计每个人喊"过"的次数。
 * 现给定一个长度为N的数组,存储了打乱顺序的每个人喊"过"的次数,请把它还原成正确的顺序,即数组的第i个元素存储编号i的人喊"过"的次数。
 */
public class Python_M_N_T_7 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();
        String[] strings = line.split(" ");

        int count = 0; // 计数周期内总的喊“过”次数
        for (String s : strings) {
            count += Integer.parseInt(s);
        }

        int[] corrects = new int[strings.length]; // 存放正确的次数
        int number = 1; // 从数字1开始叫
        while (count > 0) {

            for (int i = 0; i < corrects.length; i++) {
                if ((number + "").contains("7") || number % 7 == 0) {
                    // 数字包含7或者能被7整除,就喊“过”,计一次
                    corrects[i]++;
                    count--;
                }

                if (count == 0) {
                    // 如果所有的“过”均已出现,就暂停
                    break;
                }

                number++; // 数字递增
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int correct : corrects) {
            sb.append(correct).append(" ");
        }

        System.out.println(sb.toString().trim());


        // 输出K可能的情况 Start
        ArrayList<Integer> integers = new ArrayList<>();
        integers.add(number);
        while (true) {
            number++;
            if ((number + "").contains("7") || number % 7 == 0) break;
            integers.add(number);
        }

        System.out.println("K可能出现的数字:" + integers);
        // 输出K可能的情况 End

    }

}
正文完
 0
裴先生
版权声明:本站原创文章,由 裴先生 2022-06-20发表,共计1146字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
本站勉强运行: