时间限制:1秒 空间限制:32768K
热度指数:1175
本题知识点: 链表
题目描述
对于一个由0..n的所有数按升序组成的序列,我们要进行一些筛选,每次我们取当前所有数字中从小到大的第奇数位个的数,并将其丢弃。重复这一过程直到最后剩下一个数。请求出最后剩下的数字。
输入描述:
每组数据一行一个数字,为题目中的n(n小于等于1000)。
输出描述:
一行输出最后剩下的数字。
输入例子:
500
输出例子:
255
代码:
import java.util.*;
//比较器(无用)
class Comparators {
public static Comparator getComparator() {
return new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Integer) {
return compare( (Integer) o1, (Integer) o2);
} else return 1;
}
public int compare(Integer s1, Integer s2) {
return s2-s1;
}
};
}
}
//链表
class Node {
int value;
Node next;
public Node(int value) {
this.value = value;
}
}
public class Main {
/*
测试代码
*/
public static void main(String []args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
//建立链表
Node p = new Node(0);
Node end = p;
for(int i = 1; i <= n; i++) {
Node node = new Node(i);
end.next = node;
end = node;
}
//判断是否最后一个结点
while(p.next != null) {
//丢掉第1个结点
p = p.next;
end = p;
while(end.next != null) {
//丢掉奇数位结点
end.next = end.next.next;
//当结点数为奇数,会出现指向空结点,特殊处理
if(end.next == null) break;
end = end.next;
}
}
System.out.println(p.value);
}
}
}