一、问题描述
有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。
以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。
二、思路分析
可以利用顺序表来存放 0 ~ N-1,根据顺序表下标,每隔两个数移除一个数,直到顺序表中只有一个元素,再根据 0 号位置得到所要求的原始下标位置
三、我的代码
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int ret = finallyIndex(n);
System.out.println(ret);;
}
}
private static int finallyIndex(int n) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(i);
}
// i 表示顺序表的下标
int i = 0;
while (list.size() > 1) {
// 每隔两个数就从顺序表中移除一个
i = (i + 2) % list.size();
list.remove(i);
}
// 此时,顺序表中只有一个元素,根据 0 号下标取此元素,并返回
return list.get(i);
}
}