华为上机题

2 字符串处理转换
问题描述:    
在给定字符串中找出单词( “单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中;如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
要求实现函数:
void my_word(charinput[], char output[])
【输入】  char input[], 输入的字符串
【输出】  char output[],输出的字符串
【返回】 无
示例
输入:charinput[]="some local buses, some1234123drivers" ,
输出:charoutput[]="drivers local buses some"
输入:charinput[]="%A^123 t 3453i*()" ,

输出:charoutput[]=""


源代码

#include<iostream>
using namespace std;
int main()
{
    char a[] = {"hello1345world...IAM,qinaide,hello,you,whatare you.you"}; //输入
    char **p= new char*[strlen(a)];  //记录拆分后的数组,比如"hello","world"
    char *b = new char[sizeof(a)];   //输出
    strcpy(b, "\0");

    int i = 0, length = 0, j = 0, k = 0;

    //拆分单词,用p[j]保存(j=0,1,2...)

    while(i < strlen(a) && j < strlen(a))
    { 
        p[j] = new char[sizeof(a)];
        while((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z'))
        {
            p[j][length++] = a[i];
            i++;
        }
        while(!((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')))
        {
            i++;
        }
        p[j][length++] = '\0';
        j++;
        length = 0;

   }

       //插入排序,将单词从长到短排序

    for(i = 1; i < j; i++)
    {
       char *temp = p[i];
       if(strlen(p[i]) > strlen(p[i-1]))
       {
           for(k =i; k >0 && strlen(p[k-1]) < strlen(temp); k--)
           {
               p[k]= p[k-1];
           }
           p[k]= temp;
       }
    }
    for(i = 0; i < j; i++)

        cout<<p[i]<<endl;

       //去重复操作,定义一个标志位数组,如果单词重复出现,

       //则将其标志位设置为1,在

       // 输出的时候如果标志位为1则不输出

    int *flag = new int[j];

    for(i = j-1; i >0; i--)
    {
       flag[i] = 0;
       for(k = i-1; k > 0; k--)
       {
           if(!strcmp(p[k], p[i]))
           {
               flag[i] = 1;
           }
          else

               continue;

           }

    }
    for(i = 0; i < j; i++)
    {
       if(!flag[i])
       {
           strcat(b, p[i]);
           strcat(b, " ");
       }
    }

    cout<<b<<endl; //打印结果

    //释放指针

    for(i = 0; i < j; i++)
         delete []p[i];
    delete []p;
    delete flag;
    p = NULL;
}


猜你喜欢

转载自blog.csdn.net/xiaocong1314/article/details/12221513