幸运数字是由筛算法生成的序列中的数字:如果正整数序列中的一个数字幸存于筛过滤算法中,则它是幸运的并且仍然存在,否则它将从序列中消失。

首先,您必须获得一个数字数组,范围从1到所需的大小。
第一个数字是1,并且一直存在:在他旁边有个数字2,它成为筛子的过滤器:列表中的第二个数字(从1开始计数)必须被过滤(例如,每个偶数)。
完成此步骤后,下一个要生存的数字是3:3:消除列表中的第三个数字(从1开始计数)。
执行完此步骤后,要在3之后生存的下一个数字是7:消除列表中的每个第七个数字。
重复这些步骤,在每个步骤中递增过滤条件(也就是说,新步骤的筛分过滤器等于大于前一个步骤的最后一个幸运数字的第一个数字),直到列表中没有要消除的数字为止。
给定大小= 25且nth = 5,请参见下面的示例。

步骤1:生成一个从1到大小的列表。

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25

步骤2:第一个筛网过滤器为2:必须从开始就消除第二个数字。

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25

步骤3:现在是筛滤器3:必须从开始就消除每三个数字。

1,3,5,7,9,9,11,13,15,17,19,21,23,25
第4步:筛滤器现在为7:必须从开始就消除每个第七个数字。

1,3,7,9,9,13,15,19,21,25

步骤5:
筛滤器现在为9:必须消除第九个数字,但是我们的列表现在仅包含8个数字,因此算法结束。序列的第n个数字是13。

在下面的动画中,您可以看到120个数字列表的逐步筛选过程:紫色代表消除的数字,红色代表幸运的数字。

这是我的解决方案,(不起作用),我似乎无法获取数组中的每n个数字...

是的,我知道我的代码返回1,此刻我只是在打印东西,以尝试调试我的代码有什么问题。

public static List<Integer> generateLucky(int[] A, int steps)
    {
        List<Integer> lst = new ArrayList<>();
        for(int i = 0; i < A.length; i++)
        {
            if(i % steps == 0)
            {
                lst.add(A[i]);
            }
        }
        return lst;
    }
    public static int getLuckyNumber(int size, int nth)
    {
        List<Integer> nums = new ArrayList<>();
        for(int i = 1; i <= size; i++)
        {
            nums.add(i);
        }
        int steps = 1;
        int[] A = nums.stream().mapToInt(j->j).toArray();
        for(int i = 0; i < A.length; i++)
        {
            List<Integer> lst = generateLucky(Arrays.copyOfRange(A, 0, A.length), steps);
            System.out.println(lst);
            A = lst.stream().mapToInt(j->j).toArray();
            steps = A[1];

        }
        return 1;
    }

最佳答案

我正在回答这个问题,以便解释我的推理过程。

这是我编写的代码的测试运行的输出。

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25
listFilter: 2
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25
listFilter: 3
1, 3, 7, 9, 13, 15, 19, 21, 25
listFilter: 7
1, 3, 7, 9, 13, 15, 21, 25
13


此测试运行的输入大小为25,n为5。

当我编写代码时,我分步编写了代码。我检查了每个步骤,以确保输出是我期望的。

首先,我生成了初始列表。很好。

接下来,我生成了第一个过滤列表,该列表被2过滤。在第一个过滤列表正确打印之前,我没有编写任何其他代码。

接下来,我生成了第二个过滤列表,一个被3过滤。同样,在第二个过滤列表正确打印之前,我没有编写任何其他代码。

接下来,我生成了第三个过滤列表,一个被7过滤。

在这一点上,我有足够的代码和经验,以了解如何概括我称为proceessSieve的方法。

最后,打印中间输出可帮助您调试刚刚编写的代码。您代码中的所有其他语句应为System.out.print或println。

这是我编写的代码。我认为,从长远来看,给您代码不会帮助您学习。请注意代码中嵌入的调试语句。

import java.util.ArrayList;
import java.util.List;

public class LuckyNumber {

    public static void main(String[] args) {
        LuckyNumber luckyNumber = new LuckyNumber();
        System.out.println(luckyNumber.getLuckyNumber(25, 5));
    }

    private static boolean DEBUG = true;

    public int getLuckyNumber(int size, int index) {
        List<Integer> numberList = createOriginalList(size);
        if (DEBUG) {
            printList(numberList);
        }
        numberList = processSieve(numberList);
        return numberList.get(index - 1);
    }

    private List<Integer> createOriginalList(int size) {
        List<Integer> numberList = new ArrayList<>(size);
        for (int i = 0; i < size; i++) {
            numberList.add(i + 1);
        }
        return numberList;
    }

    private List<Integer> processSieve(List<Integer> numberList) {
        int listIndex = 1;
        int count = 0;
        int listFilter = numberList.get(listIndex);
        while (listFilter <= numberList.size()) {
            if (DEBUG) {
                System.out.println("listFilter: " + listFilter);
            }
            numberList = filterList(numberList, listFilter);
            if (DEBUG) {
                printList(numberList);
            }
            if (count > 0) {
                listIndex++;
            }
            count++;
            listFilter = numberList.get(listIndex);
        }
        return numberList;
    }

    private List<Integer> filterList(List<Integer> list, int listFilter) {
        List<Integer> filterList = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            if ((i + 1) % listFilter == 0) {
                continue;
            } else {
                filterList.add(list.get(i));
            }
        }
        return filterList;
    }

    private void printList(List<Integer> list) {
        for(int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i));
            if (i < (list.size() - 1)) {
                System.out.print(", ");
            }
        }
        System.out.println();
    }

}

关于java - 获取幸运号码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60383179/

10-09 06:31