小瓜现在让1到n这n个整数排成一列,但是他只告诉你每个整数的后面那个数是什么(最后一个整数的后面那个数是0),请你帮忙复原这个队列。
输入第一行一个整数n(n<=100000),表示有n个整数。
接下来n行,每行两个数i,j,表示排在整数i后面的那个数是j。输出n行,每行一个整数,表示完整的队列。
输入样例4
1 3
2 4
3 2
4 0
输出样例
1
3
2
4
首先正常思路,从后往前找,先找0,依次往前
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] l = new int[n+1];
for (int i = 0; i < n; i++) {
int s =sc.nextInt();
int ss =sc.nextInt();
l[ss]=s;
}
ArrayList<Integer> z = new ArrayList<Integer>();
int temp = 0;
while (z.size()<n) {
z.add(l[temp]);
temp=l[temp];
}
for (int i = z.size()-1; i >= 0; i--) {
System.out.println(z.get(i));
}
}
}
但是我们可以看到。n的大小是小于十万的,如果每寻找一个数就遍历依次全部数则需要大量的时间,肯定会超时!
然后
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] l = new int[n+1];
for (int i = 0; i < n; i++) {
int s =sc.nextInt();
int ss =sc.nextInt();
l[ss]=s;
}
ArrayList<Integer> z = new ArrayList<Integer>();
int temp = 0;
while (z.size()<n) {
z.add(l[temp]);
temp=l[temp];
}
for (int i = z.size()-1; i >= 0; i--) {
System.out.println(z.get(i));
}
}
}