18.4.4&18.4.18(NBUOJ)

1138 清除行注释

 

 

Alert:本文代码都是博主自己写的,仅供参考,请不要复制粘贴,NBU的学弟学妹们请在看懂以后自己写一遍。

  • 思路:这一题我一开始觉得要考虑引号内的//(比如输入输出里的引号和字符串的引号),但是后来一问发现这个题的数据要low一点,不考虑也可以。
  • 代码:
#define judge (s[i][j]=='/'&&s[i][j+1]=='/'?0:1)

    while( gets(s[n]) ){
        n++;
    }
    for(i=0;i<n;i++){
        for(j=0;s[i][j]!='\0'&&judge;j++){
            printf("%c",s[i][j]);
        }
        printf("\n");
}

1185 城市名排序

 

  • 思路:ummm,就是一个库函数运用题吧。
  • 代码:
scanf("%d",&n);
    getchar();//主要是这里别忘了就好
    for(i=0;i<n;i++){
        gets(s[i]);
    }
    for(i=0;i<n-1;i++){
        for(j=i;j<n;j++){
            if(strcmp(s[i],s[j])>0){
                char temp[100];
                strcpy(temp,s[i]);
                strcpy(s[i],s[j]);
                strcpy(s[j],temp);
            }
        }
}

1340 幸运抽奖

 

  • 思路:这题可以用函数把后面的多张卡片合在一起,然后暴力求解。
  • 代码:
gets(s);
    scanf("%d",&n);
    getchar();
    for(i=0;i<n;i++){
        gets(temp);
        strcat(card,temp);//把新卡片剪切到卡片集合里
    }
    for(i=0;s[i]!='\0';i++){//tip:利用i和j在break与不break之间值的不同
        for(j=0;card[j]!='\0';j++){
            if(s[i] == card[j])//找到了就跳出内层循环
                break;
        }
        if(card[j] == '\0'){//没找到就跳出外层循环
            break;
        }
    }

    if(s[i]!='\0') printf("No\n");
else printf("Yes\n");

1352 CoCo去过的城市

 

  • 思路:结构体做,具体思路见代码。
  • 核心代码:
typedef struct position{
    char name[105];
    int times;
}pos;
        int j,i=0,re=0;//记得初始化
        getchar();
        while(n--){
            gets(temp);
            for(j=0;j<i;j++){
                if(strcmp(city[j].name,temp) == 0){//出现过
                    city[j].times++;
                    break;
                }
            }
            if(j == i){//没出现过
                strcpy(city[i].name,temp);
                city[i++].times=1;
            }
        }
        n=i;//城市个数
        gets(temp);
        for(i=0;i<n;i++){
            if(strcmp(temp,city[i].name) == 0){
                re=city[i].times;
                break;
            }
        }
        printf("%d\n",re);

 

1341 快乐的字符串一

 

 

  • 思路:用一个字符串存happy,一个整形变量ans进行标记,每次发现连续正确字符ans++,错误则归零,最后ans+1(长度=数组下标加1)若等于happy的长度则字符串符合规则,否则不符合。
  • 核心代码:
 while(n--){
        gets(temp);
        int ans=0;
        for(j=0;temp[j]!='\0';j++){
            if(temp[j] == happy[ans]){
                ans++;
                if(happy[ans+1] == '\0') break;//happy找到了
            }
            else ans=0;
        }
        if(ans+1 == strlen(happy)) strcpy(hpseq[i++],temp);
}

1404 比较串的大小

 

  • 思路1:先比较内容,如果前面内容一样,但是不一样长,再比较长短。
  • 思路2:直接比较到最短的那一串的’\0’为止就好了。
  • 代码1:
int mystrcmp(char s1[],char s2[]){
    int re=0,len1=strlen(s1),len2=strlen(s2);
    int len=min(len1,len2);
    for(int i=0;i<len;i++){
        re=s1[i]-s2[i];
        if(re == 0) continue;
        else break;
    }
    if(re == 0 && len1<len2) return -1;
    else if(re == 0 && len1>len2) return 1;
    return re;
}
  • 代码2:
int mystrcmp(char s1[],char s2[]){
    int len1=strlen(s1);
    int len2=strlen(s2);
    for(int i=0;i<=len1&&i<=len2;i++){
        if(s1[i]>s2[i])
            return 1;
        else if(s1[i]<s2[i])
            return -1;
    }
    return 0;
}

 

小结

 

这次发现的问题很多都是你们之前就存在的,我再讲一遍吧。

 

  1. 有的小可爱写循环的时候自己拍脑袋想出一个长度,这样去做遍历就会计算很多脏数据,最后结果就不对了。包括数组越界的问题,要注意循环边界,边界设置的不合适会导致莫名其妙的问题。
  2. 还是逻辑错误。我们做判断的时候会用到一个标记变量,它可以这样用:(1)一旦标记到某种结果就break掉;(2)一开始就给这个变量初始化,一旦发现某种情况就改变它的初值。但是有的小可爱不采用第二种方法却循环全程都在改变标记变量的值,这相当于只判断了循环的最后一个元素。
  3. 我解释一下字符串相关的函数:scanf函数输入字符串碰到空格停止,gets碰到换行停止,getchar只拿走单个字符。但是scanf之后的换行会放在缓冲区内,如果后面跟着gets,gets会拿走一个空字符这时候就需要我们使用getchar把这个换行吸收掉。另外关于为什么scanf字符串不需要&的问题你们也可以参考这篇博客:https://blog.csdn.net/qq_18254385/article/details/45539667
  4. 这次看到很多小可爱都不知道char字符串是以’\0’为结尾的,如果你自己写一个字符串,然后想输出它,结尾一定不要忘记加’\0’啊,脏数据的例子我也给过你们不少了,要会判断了噢!
  5. 还有一点就是在main函数里面输入过的东西,一定不要再在函数里面再写关于这东西的输入了,因为你已经将输入过的实参的内容传递给形参了。直接用就好了,不然,你会需要输入两遍,你自己输入一遍当然不会给你结果,你自己也可以输入两遍,但是OJ不会给你两遍的。有只小可爱莫名担心实参无法传递给形参这种事情…请相信C语言出现的时间足够久,也相信写内核的人,不会出现这种问题的…
  6. 最后,送你们一些基本的排序函数吧,排序名称自行翻译。你们可以对比理解一下这些排序方式。分析一下它们的复杂度。

简单排序:

(1)

voidselectionsort(int a[],int size){

        int i,j,max;

        for(i=0;i<size;i++){

                 max=i;

                 for(j=i+1;j<size;j++){

                         if(a[i]>a[max])

                                  max=i;

                 }

        }

}

 

(2)

voidbubblesort(int a[],int size){

        int i,j,temp;

        for(i=size-1;i>0;i--){

                 for(j=0;j<i;j++){

                         if(a[j]>a[j+1]){

                                  temp=a[j];

                                  a[j]=a[j+1];

                                  a[j+1]=temp;

                         }

                 }

        }

}

 

(3)

voidinsertionsort(int a[],int size){

        int i,j,k,temp;

        for(i=1;i<size;i++){

                 for(j=0;j<i;j++){

                         if(a[j]>a[i]){

                                  temp=a[i];

                                  for(k=i;k>j;k--)

                                          a[k]=a[k-1];

                                  a[j]=temp;

                                  break;

                         }

                 }

        }

}

快排(递归)

void quicksort(int a[],int s, int e){

   if(s>=e)

       return;

   int k=a[s],i=s,j=e;

   while(i!=j){

       while(j>i&&a[j]>=k)

           j--;

       swap(a[i],a[j]);

       while(i<j&&a[i]<=k)

           i++;

       swap(a[i],a[j]);

    }

   quicksort(a,s,i-1);

   quicksort(a,i+1,e);

}

想了解排序算法的同学可以去这里瞧瞧:https://www.cnblogs.com/onepixel/articles/7674659.html

 

 

 

 

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值