1-n,共n个数字,初始时每个数都是独立的算作1个串,之后会进行n-1次合并,每次合并操作,会把一个串放到另一个串的后面。合并时会给出2个数字,x y,表示将以y为开头的串放到x为开头的串的后面。例如:1 3 (3放到1后面,=> (1 3), 2, 4 )2 4 (4放到2后面,=> (1 3), (2 4))1 2 (2放到1后面,=> (1 3 2 4))在n - 1次合并后,按顺序输出最终剩下的这个串的全部数字。
输入第1行:1个数n(2 <= n <= 10000)
后面n - 1行,每行2个数x y,对应n - 1次合并操作,把以y为开头的串放到以x为开头的串的末尾。输出输出共n行,每行1个数,对应最终串包含的n个数字。
输入样例
4
1 3
2 4
1 2
输出样例
1
3
2
4
一开始没想到使用链式结构,直接使用字符串相加
ArrayList<String> l = new ArrayList<String>();
for (int i = 0; i < n-1; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
int aw = f(a,l);
int bw = f(b,l);
if ((aw==-1&&bw!=-1)||(bw==-1&&aw!=-1)) {
if (aw!=-1) {
String z = l.get(aw);
l.remove(aw);
l.add(aw,z+b);
}else{
String z = l.get(bw);
l.remove(bw);
l.add(bw,a+z);
}
}else if(aw!=-1&&bw!=-1){
int min = Math.min(aw, bw);
int max = Math.max(aw, bw);
String z1 = l.get(aw);
String z2 = l.get(bw);
l.remove(max);
l.remove(min);
l.add(min,z1+z2);
}else{
l.add(a+""+b);
}
}
在定义一个查找a,b位置的方法
private static int f(int s, ArrayList<String> l) {
String z = s+"";
int len = z.length();
for (int i = 0; i < l.size(); i++) {
if (l.get(i).equals(".")||l.get(i).length()<len) {
continue;
}
if (l.get(i).substring(0,len).equals(z)) {
return i;
}
}
return -1;
}
最后输出集合内字符串就行了
但随即发现给定的数据中存在大于10的数,也就是多位数,而字符串并不能分辨多位数,随即便采用二维集合,动态操作集合便能分辨多位数
ArrayList<ArrayList<Integer>> l = new ArrayList<ArrayList<Integer>>();
for (int i = 0; i < n-1; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
int aw = f(a,l);
int bw = f(b,l);
if (aw==-1&&bw!=-1) {
l.get(bw).add(0,a);
}else if(bw==-1&&aw!=-1){
l.get(aw).add(b);
}else if(aw!=-1&&bw!=-1){
for (int j = 0; j < l.get(bw).size(); j++) {
l.get(aw).add(l.get(bw).get(j));
}
l.remove(bw);
}else{
l.add(new ArrayList<Integer>());
l.get(l.size()-1).add(a);
l.get(l.size()-1).add(b);
}
}
其功能类似,只不过由字符串转为集合
但提交之后提示超时,参考了大神的代码,便开始采用链表
定义链表
public static class node{
private int date;
private int next;
}
对链表操作
int n = sc.nextInt();
node[] l = new node[n+1];
for (int i = 1; i <= n; i++) {
l[i].date=i;
}
int s = 0;
for (int i = 0; i < n-1; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
if (i==n-2) {
s=a;
}
while (l[a].next!=0) {
a=l[a].next;
}
l[a].next=b;
}
System.out.println(l[s].date);
while (l[s].next!=0) {
s=l[s].next;
System.out.println(l[s].date);
}
提交后ac
总结:算法中包含数据结构,数据结构包含算法,相辅相成才能造就优秀程序员