MT25. 超链接
描述
输入描述
第一行输入一个数 n ,接下来 n 行,每行一个字符串,表示每个超链接的名称,名称只由小写字母构成,长度不超过 20,且所有名称互不相同。 接下来输入一个数 m ,表示用户点击了 m 个超链接,最后 m 行表示用户点击过的超链接名称,这 m 个超链接中可能有重复。输出描述
输出若干行,每行一个名称,所有仍为蓝色的超链接名称,名称的顺序按照字典序排序,如果全为紫色则不输出。示例1
输入:
5 sina qq taobao jd baidu 3 qq baidu baidu
输出:
jd sina taobao
C 解法, 执行用时: 2ms, 内存消耗: 328KB, 提交时间: 2021-08-03
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(){ int n=0; scanf("%d",&n); //在下面用%c格式读入字符时,空格字符和转义字符(包括回车)都会被当作有效字符读入 //所以这里要加个getchar();把回车读走 getchar(); if(n<1||n>100){ printf("请输入1~100之间的整数\n"); return 0; } //二维数组动态内存分配,allLink是输入的全部超链接 char**allLink = (char**)malloc(n*sizeof(char*)); for(int i=0;i<n;i++) allLink[i] = (char*)malloc(21*sizeof(char)); for(int i=0;i<n;i++){ //字符串长度是21,因为还有'\0' for(int j=0;j<21;j++){ char ch; scanf("%c",&ch); //判断是否小写,注意中间的&&不能漏掉啊!!!! if('a'<=ch&&ch<='z'){ allLink[i][j]=ch; }else if(ch=='\n'){ break; }else{ printf("输入错误,只能输入小写字母\n"); return 0; } } } int m=0; scanf("%d",&m); getchar(); if(m<1||m>100){ printf("请输入1~100之间的整数\n"); return 0; } //二维数组动态内存分配,visitedLink是输入的全部被访问超链接 char**visitedLink = (char**)malloc(m*sizeof(char*)); for(int i=0;i<m;i++) visitedLink[i] = (char*)malloc(21*sizeof(char)); for(int i=0;i<m;i++){ for(int j=0;j<21;j++){ char ch; scanf("%c",&ch); if('a'<=ch&&ch<='z'){ visitedLink[i][j]=ch; }else if(ch=='\n'){ break; }else{ printf("输入错误,只能输入小写字母\n"); return 0; } } } //标记数组,被访问为1,未被访问为0 int *visited; visited=(int*)malloc(n*sizeof(int)); //全初始化为0 memset(visited,0,n); //统计重复访问和不存在的访问链接 int repeatVisit=0,notExistedLink=0; for(int i=0;i<m;i++){ int flag=0; for(int j=0;j<n;j++){ if(strcmp(visitedLink[i],allLink[j])==0){ flag=1; if(visited[j]==1){ repeatVisit++; break; } else{ visited[j]=1; break; } } } if(flag==0) notExistedLink++; } //二维数组动态内存分配,notVisitedLink是未被访问的链接 //一共有n-m+repeatVisit+notExistedLink个,记为notVisitedLinkNum int notVisitedLinkNum=n-m+repeatVisit+notExistedLink; char**notVisitedLink = (char**)malloc(notVisitedLinkNum*sizeof(char*)); for(int i=0;i<notVisitedLinkNum;i++) notVisitedLink[i] = (char*)malloc(21*sizeof(char)); int k=0,e=0; for(;e<n;e++){ if(visited[e]==0){ strcpy(notVisitedLink[k],allLink[e]); k++; } } //冒泡排序 for(int i=0;i<notVisitedLinkNum-1;i++){ for(int j=0;j<notVisitedLinkNum-i-1;j++){ if(strcmp(notVisitedLink[j],notVisitedLink[j+1])>0){ char temp[21]; strcpy(temp,notVisitedLink[j]); strcpy(notVisitedLink[j],notVisitedLink[j+1]); strcpy(notVisitedLink[j+1],temp); } } } for(int i=0;i<notVisitedLinkNum;i++){ printf("%s\n",notVisitedLink[i]); } //记得要释放指针 for(int i=0;i<n;i++) free(allLink[i]); free(allLink); free(visited); for(int i=0;i<notVisitedLinkNum;i++) free(notVisitedLink[i]); free(notVisitedLink); for(int i=0;i<m;i++) free(visitedLink[i]); free(visitedLink); return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-07-28
#include <stdio.h> #include <stdlib.h> typedef struct{ int isclicked; char name[21]; }node; int main(void) { int n,m,i,j,k; // n=10; char clickedname[21]; scanf("%d",&n); node t[n],tmp; for(i=0;i<n;i++) { t[i].isclicked=0; scanf("%s",t[i].name); } for(i=0;i<n-1;i++) { for(j=0;j<n-i-1;j++) { if(strcmp(t[j].name,t[j+1].name)>0) { strcpy(tmp.name,t[j].name); tmp.isclicked=t[j].isclicked; strcpy(t[j].name,t[j+1].name); t[j].isclicked=t[j+1].isclicked; strcpy(t[j+1].name,tmp.name); t[j+1].isclicked=tmp.isclicked; } } } scanf("%d",&m); for(i=0;i<m;i++) { scanf("%s",clickedname); for(j=0;j<n;j++) { if(strcmp(clickedname,t[j].name)==0) { t[j].isclicked=1; break; } } } for(i=0;i<n;i++) { if(t[i].isclicked==0) printf("%s\n",t[i].name); } }