怎么获取幸运数字?
问题描述
[幸运数字是由筛子算法生成的序列的数字:如果正整数序列中的一个数字幸存于筛子过滤算法中,则它是幸运的并且得以生存,否则它将从序列中消失。
首先,您必须获得一个数字数组,从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、11、13、15、17、19、21、23、25第4步:筛滤器现在为7:必须从开始就消除每个第七个数字。
1、3、7、9、13、15、19、21、25
第5步:筛滤器现在为9:必须消除第九个数字,但是我们的列表现在仅包含8个数字,因此算法结束。序列的第n个数字是13。
在下面的动画中,您可以看到逐步筛选过程中的120个数字:紫色填充表示消除的数字,红色填充表示幸运的数字。
这是我的解决方案,(它不起作用),我似乎无法获取数组中的每个第n个数字...
是的,我知道我的代码返回1,我现在只是在打印东西,以尝试调试我的代码有什么问题。
public static List generateLucky(int[] A, int steps)
{
List lst = new ArrayList();
for(int i = 0; i nums = new ArrayList();
for(int i = 1; i j).toArray();
for(int i = 0; i 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 numberList = createOriginalList(size);
if (DEBUG) {
printList(numberList);
}
numberList = processSieve(numberList);
return numberList.get(index - 1);
}
private List createOriginalList(int size) {
List numberList = new ArrayList(size);
for (int i = 0; i processSieve(List numberList) {
int listIndex = 1;
int count = 0;
int listFilter = numberList.get(listIndex);
while (listFilter 0) {
listIndex++;
}
count++;
listFilter = numberList.get(listIndex);
}
return numberList;
}
private List filterList(List list, int listFilter) {
List filterList = new ArrayList();
for (int i = 0; i list) {
for(int i = 0; i
思路二:
首次运行,调试前:
[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]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]
[1, 7, 13, 19, 25]
我删除了导致错误的行:steps = A[1];
。然后添加:
int stepindex = 1;
- 处理步进的逻辑。似乎缺少该部分。
- 确保stepindex小于数组的总长度。
- 还要检查(步骤索引的)数组中的当前值,看是否小于或等于先前的
steps
。如果是,则将stepindex增加(加一)并重做检查。 - 如果新步长大于数组的长度,则无需删除其他内容,因此
break
。
- 更改了决定保留哪些数字的语句
我没有将代码更改为仅使用数组或列表,因为我试图将其保持与原始代码尽可能接近。
现在打印:
steps = 2
stepindex = 1
A = [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]
steps = 3
stepindex = 1
A = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]
steps = 7
stepindex = 2
A = [1, 3, 7, 9, 13, 15, 19, 21, 25]
steps = 9
stepindex = 3
A = [1, 3, 7, 9, 13, 15, 21, 25]
getLuckyNumber(25,5): nth = 13
------------
steps = 2
stepindex = 1
A = [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]
steps = 3
stepindex = 1
A = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]
steps = 7
stepindex = 2
A = [1, 3, 7, 9, 13, 15, 19, 21, 25]
steps = 9
stepindex = 3
A = [1, 3, 7, 9, 13, 15, 21, 25]
getLuckyNumber(25,5000): nth = -2147483648
您的修改后的代码:
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
public class StackOverflowTest {
public static void main(String[] args){
System.out.println(" getLuckyNumber(25,5): nth = " + getLuckyNumber(25,5));
System.out.println("------------");
System.out.println(" getLuckyNumber(25,5000): nth = " + getLuckyNumber(25,5000));
}
public static List generateLucky(int[] A, int steps) {
List lst = new ArrayList();
System.out.println("A = " + Arrays.toString(A)); // debug statement
for (int i = 0; i nums = new ArrayList();
for (int i = 1; i j).toArray();
for(int i = 0; i = (A.length)) {break;}
List lst = generateLucky(Arrays.copyOfRange(A, 0, A.length), steps);
// System.out.println(lst);
A = lst.stream().mapToInt(j->j).toArray();
// steps = A[1]; // this is the source of the Runtime Error..
}
System.out.println("A = " + Arrays.toString(A)); // debug statement
if (nth
以上内容就是爱站技术频道小编为大家分享的怎么获取幸运数字?,看完以上分享之后,大家应该都知道怎么操作了吧。