北航计算机机试15单词排序

【简要题意】
输入一篇可能未经排版的文章,挑选出其中的单词【单词中不包含“(”等特殊符号】,然后按字典序输出。

题目确实是比较简洁
- 首先它给出了单词中不包含特殊符号,这一步应该是要筛选出给的文章中符合’单词’标准的单词

  • 其次则是对这些单词的一个按照字典序列的排序,在string.h头文件中,strcmp函数的比较大小的原则,则是按照字母表的顺序进行排序
    所以在我们比较的过程中,我可以来通过比较也就是类似于int型数的排序来达到这么一个效果

  • 输出这里并没有给出输出格式,但还是要注意,!!输出很重要,看清题意,不可大意,不可狂妄,谨慎细心,足矣

字典序法
  字典序法中,对于数字1、2、3……n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是54321。
  字典序算法如下:
  设P是1~n的一个全排列:p=p1p2……pn=p1p2……pj-1pjpj+1……pk-1pkpk+1……pn
1)从排列的右端开始,找出第一个比右边数字小的数字的序号j(j从左端开始计算),即j=max{i|pi < pi+1}
2)在pj的右边的数字中,找出所有比pj大的数中最小的数字pk,即k=max{i|pi>pj}(右边的数从右至左是递增的,因此k是所有大于pj的数字中序号最大者)
3)对换pi,pk
4)再将pj+1……pk-1pkpk+1pn倒转得到排列p’’=p1p2…..pj-1pjpn…..pk+1pkpk-1…..pj+1,这就是排列p的下一个下一个排列。

看例子会比较容易懂

  例如839647521是数字1~9的一个排列。从它生成下一个排列的步骤如下:
  自右至左找出排列中第一个比右边数字小的数字4839647521
  在该数字后的数字中找出比4大的数中最小的一个5839647521
  将5与4交换839657421
  将7421倒转839651247
  所以839647521的下一个排列是839651247。

这是C语言课本上的一段原code,输出是按字典序输出的

#include<stdio.h>
#include<string.h>

void main()
{
       char str[8][11]={"CHIN21A","JAP25AN","KOR24EA","12INDIA","23CANADA","A12MERICAN","44ENGLAND","F42RANCE"};
       char temp[11];
       int i,l;
    for (i=0;i<8;i++)
       {
              for(l=0;l<11;l++)
              {
                     printf("%c",str[i][l]);
              }
              printf("\n");
       }
       //排序
       printf("以上8个国家按字典中排序如下所示:\n");
       int j,k;
       for(j=0;j<8;j++)
       for(k=j+1;k<10;k++)
       {
                     if(strcmp(str[j],str[k])>0)
                     {//交换
                            strcpy(temp,str[j]);
                            strcpy(str[j],str[k]);
                            strcpy(str[k],temp); 
                     }
       }
              for(i=0;i<8;i++)//输出
                     printf("%s\n",str[i]);
}
全部评论

相关推荐

牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务