华为笔试-字符串拆分和排序
2014-04-21 09:09
274 查看
问题描述:
在给定字符串中找出单词
( “单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,
如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序,
(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中;
如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,
请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
要求实现函数:
void my_word(char input[], char output[])
【输入】 char input[], 输入的字符串
【输出】 char output[],输出的字符串
【返回】 无
示例
输入:char input[]="some local buses, some1234123drivers" ,
输出:char output[]="drivers local buses some"
输入:char input[]="%A^123 t 3453i*()" ,
输出:char output[]=""
在给定字符串中找出单词
( “单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,
如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序,
(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中;
如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,
请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
要求实现函数:
void my_word(char input[], char output[])
【输入】 char input[], 输入的字符串
【输出】 char output[],输出的字符串
【返回】 无
示例
输入:char input[]="some local buses, some1234123drivers" ,
输出:char output[]="drivers local buses some"
输入:char input[]="%A^123 t 3453i*()" ,
输出:char output[]=""
/* 问题描述: 在给定字符串中找出单词 ( “单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔, 如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序, (排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中; 如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词, 请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。 要求实现函数: void my_word(char input[], char output[]) 【输入】 char input[], 输入的字符串 【输出】 char output[],输出的字符串 【返回】 无 示例 输入:char input[]="some local buses, some1234123drivers" , 输出:char output[]="drivers local buses some" 输入:char input[]="%A^123 t 3453i*()" , 输出:char output[]="" 作者:gylltq 时间:2014-4-20 主要函数:isalpha,strcpy,strcat,strcmp。 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> void my_word(char input[],char output[]) { int start; int end; int i; int j = 0; int k = 0; int n = 0; char temp[100][100]; int flag = 0; int flagA = 0; char p[100]; int ret[100]; char temp1[100]; int tmp; char str[1024]; /* *将输入常量字符串转存入变量内,并在最后 *加空格,便于后面对字符串进行拆分 */ strcpy(str,input); strcat(str," "); // printf("%s\n",str); /* 下面这段代码首先判断字符是否为字母,连续 字母个数是否大于1,将连续字母数大于1的字 符串进行拆分,并比较是否属于重复的字符串, 将不同字符串存入字符串数组 */ for(i = 0;str[i]!='\0';i++){ if(isalpha(str[i]) != 0){ //判断是否为大小写字母 // if(('a'<=input[i]&&input[i]<='z')||('A'<=input[i]&&input[i]<='Z')){ if(flagA == 0) start = i; flagA++; } else{ if(flagA > 1){ //判断连续字母个数是否大于1 end = i; strncpy(p,&str[start],end-start); p[end-start] = '\0'; //结束符 for(k = 0;k < n;k++){ //比较是否属于重复字符串 if(!(strcmp(temp[k],p))){ flag = 1; break; } else flag = 0; } if(flag == 0){ //不重复则存入字符串数组 strcpy(temp ,p); ret = flagA; // printf("%s\t",temp ); // printf("%d\n",ret ); n++; } } flagA = 0; } } /* 这段代码将相同长度字符串存入单个指针, 解决排序时如果长度相同,则按出现的顺 序进行排列这个问题。然后进行排序 */ char same[100][100]; int flagsamenum[100]; int flagsame = 0; int m = 0; for(i = 0;i < n;i++){ for(j = 0;j < i;j++){ if(ret[i] == ret[j]){ flagsame = 1; break; } else flagsame = 0; } if(flagsame == 0){ for(k = i+1;k < n;k++){ if(ret[i] == ret[k]){ strcat(temp[i]," "); strcat(temp[i],temp[k]); } } strcpy(same[m],temp[i]); flagsamenum[m] = ret[i]; // printf("%s\t",same[m]); // printf("%d,%d\n",m,flagsamenum[m]); m++; } } for(i = 0;i < m;i++){ for(k = i;k < m;k++){ if(flagsamenum[i] < flagsamenum[k]){ tmp = flagsamenum[i]; flagsamenum[i] = flagsamenum[k]; flagsamenum[k] = tmp; strcpy(temp1,same[i]); strcpy(same[i],same[k]); strcpy(same[k],temp1); } } // ret1[i] = ret[i]; } for(i = 0;i < m;i++){ if(i == 0) //防止第一个字符为空格 strcpy(output, same[0]); else strcat(output,same[i]); if(i < m-1) strcat(output," "); } printf("%s\n",output); } int main() { char input[] = "yes,this is 3423rright%A^123 at 3453i*()"; char output[] = ""; my_word(input,output); return 0; }