列表

详情


MT25. 超链接

描述

很多网页上会显示一些其他网页的超链接,如一些搜索网页会逐条列出搜索到的条目。
在一些网页中,被用户点击过的超链接会换一种颜色显示。假设某网页一开始有 n 条超链接,从上到下由 1 到 n 编号,每条超链接都显示成一个字符串,最开始所有的超链接用蓝色显示。
现在给出用户点击过哪些超链接,一条超链接只要被点击过了,就会由蓝色变成紫色,请输出最后仍为蓝色的超链接。

数据范围:

输入描述

第一行输入一个数 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);
    }
}

上一题