题目https://pintia.cn/problem-sets/994805342720868352/problems/994805460652113920
问题:一个测试点超时,一个测试点答案错误。if(i!=-1) printf("%5d\n",i);
改成05d
超时问题:双循环检查。改进:flag看是否在第一个单词中出现。(已解决)
#include<stdio.h>
#include<stdlib.h>
struct Node{
char data;
int next;
}node[100001];
int main(){
int ad1,ad2,n,i,j,ad;
scanf("%d%d%d",&ad1,&ad2,&n);
for(i=0;i<n;i++){
scanf("%d",&ad);
scanf(" %c %d",&node[ad].data,&node[ad].next);
}
for(i=ad1;i!=-1;){
for(j=ad2;j!=-1;){
if(j==i) break;
j=node[j].next;
}
if(j==i) break;
i=node[i].next;
}
if(j==i&&j!=-1) printf("%5d\n",i);
else printf("-1\n");
return 0;
}
添加flag便可变成单循环。超时问题解决。
#include<stdio.h>
#include<stdlib.h>
struct Node{
char data;
int next;
int flag;
}node[100001];
int main(){
int ad1,ad2,n,i,ad;
scanf("%d%d%d",&ad1,&ad2,&n);
for(i=0;i<n;i++){
scanf("%d",&ad);
scanf(" %c %d",&node[ad].data,&node[ad].next);
}
for(i=ad1;i!=-1;){
node[i].flag=0;
i=node[i].next;
}
for(i=ad2;i!=-1;){
node[i].flag=1;
i=node[i].next;
}
for(i=ad1;i!=-1;){
if(node[i].flag==1) break;
i=node[i].next;
}
if(i!=-1) printf("%5d\n",i);
else printf("-1\n");
return 0;
}
算法笔记上的答案。
1,先统一设置flag为0,然后设置单词1的flag为1,在循环单词2时便可直接判断。
2,我的,先不管,设置单词1flag为0,单词2的flag为1,然后在遍历检查单词1的flag。异曲同工。
3,最初思路误区:没想到判断的是下标,以及单词以哈希数组形式存储。
4,flag的设置。
#include<stdio.h>
#include<stdlib.h>
struct Node{
char data;
int next;
int flag;
}node[100010];
int main(){
int ad1,ad2,n,i,ad;
scanf("%d%d%d",&ad1,&ad2,&n);
for(i=0;i<100010;i++){
node[i].flag=0;
}
for(i=0;i<n;i++){
scanf("%d",&ad);
scanf(" %c %d",&node[ad].data,&node[ad].next);
}
for(i=ad1;i!=-1;i=node[i].next){
node[i].flag=1;
}
for(i=ad2;i!=-1;i=node[i].next){
if(node[i].flag==1) break;
}
if(i!=-1) printf("%05d\n",i);
else printf("-1\n");
return 0;
}