您的位置:首页 > 编程语言

华为笔试-字符串拆分和排序

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[]=""

作者: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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  华为 排序算法 编程