`
阿尔萨斯
  • 浏览: 4107071 次
社区版块
存档分类
最新评论

华为练习2 查找兄弟单词

 
阅读更多
/******************************************************************************

  Copyright (C), 2001-2012, Huawei Tech. Co., Ltd.

 ******************************************************************************
  File Name     : FindSimilarWord.cpp
  Version       :
  Author        :
  Created       : 2012/09
  Last Modified :
  Description   :
  Function List :

  History       :
  1.Date        : 2012/09
    Author      :
    Modification: Created file

******************************************************************************/

char word[1000][51];
int counts=0;
int wordlength[1000];
int hisbrother[1000];

/******************************************************************************
原    型:int AddOneWord (char* Word);
功    能:在字典中增加一个单词
输入参数: 
          Word 单词字符串,调用者保证Word指针不为空,指向的是合法单词
输出参数:
          无
返回值:
        -1 失败(单词在字典中已存在等情况)
        0  成功
********************************************************************************/
int AddOneWord (char* Word)
{
    /* 在这里实现功能 */
	//if(counts>1000)return -1;
	int length=0;//字长
	for(int i=0;i<51;i++){
			word[counts][i]=*Word;
			length++;
			if(*Word=='\0')break;		
			Word++;
			
			if(i==49){
				word[counts][50]='\0';//特殊情况,最大字数为50,则要有51个字节来保存,以使最后一个可以放置一个'\0'
				length++;
			}
	}
	wordlength[counts]=length-1;//去掉末尾的'\0',得到长度
	bool haved=false;

	for(int i=0;i<counts;i++){
		if(wordlength[i]==wordlength[counts]){//首先字数相等,才可能相同
		for(int j=0;j<wordlength[counts];j++){
			if(word[i][j]!=word[counts][j])break;
			if(j==wordlength[counts]){
				haved=true;
			}
		}
		if(haved)break;//当单词表中已经有这个单词时,则不能存入
		}
	}
	if(haved)return -1;
	else counts++;//如果没有重复,则完成加入
    return 0;
}

/******************************************************************************
原    型:int FindSimilarWordNum (char* Word);
功    能:查找指定单词在字典中的兄弟单词个数
输入参数:
          Word 指定单词字符串,调用者保证Word指针不为空,指向的是合法单词
输出参数:
          无
返回值:
          返回指定单词在字典中的兄弟单词总个数。如果不存在兄弟单词,返回0
*******************************************************************************/
int FindSimilarWordNum (char* Word)
{
    /* 在这里实现功能 */
	char WORD[51];
	int length=0;
	int CharNum[26];
	int brother=0;
	
	for(int i=0;i<26;i++)CharNum[i]=0;//字母数量数组
	for(int i=0;i<51;i++){
		WORD[i]=*Word;
		if(*Word=='\0')break;
		length++;
		CharNum[(*Word-97)]++;//a为97
		Word++;
	}
	int need;
	bool isb;//是兄弟吗?
	for(int i=0;i<counts;i++){//遍历所有单词
		if(wordlength[i]==length){//当字数相同时,来进行判断
			for(int j=0;j<26;j++){//遍历,判断26个字母数分别是否相同
				need=CharNum[j];
				isb=true;
				for(int k=0;k<length;k++){
					if(word[i][k]==j+97)need--;//每当匹配到相同字母,则need减一		
				}
				if(need!=0){//字母数相等则继续判断,不等,则跳出,不是兄弟
					isb=false;
					break;
				}

			}
			if(isb){
				for(int j=0;j<length;j++){
					if(word[i][j]!=WORD[j]){//当单词不是同一单词时,为兄弟单词
						hisbrother[brother]=i;//将兄弟单词的序号传给数组保存,直接用于之后的函数
						brother++;
					
						break;
					}
				}

			}

		}
	}

	
	return brother;

   // return 0;
}

/******************************************************************************
原    型:int FindOneSimilarWord (char* Word, int Seq, char* SimilarWord);
功    能:查找指定单词的指定序号的兄弟单词,指定序号指字典中兄弟单词按字典顺序
          排序后的序号(从1开始)
输入参数:
          Word 指定单词字符串,调用者保证Word指针不为空,指向的是合法单词
          Seq 指定序号(大于等于1)
输出参数:
          SimilarWord 返回兄弟单词字符串,指针不为空,指向的内存由调用者预先分配,
          占51个字节长度,输出的兄弟单词必须紧跟’\0’结束。如果不存在指定序号的
          兄弟单词,输出空串。
返回值:
          -1 失败(如果不存在指定序号的兄弟单词,返回失败)
          0  成功
*******************************************************************************/
int FindOneSimilarWord (char* Word, int Seq, char* SimilarWord)
{
    /* 在这里实现功能 */

	int n=FindSimilarWordNum(Word);//获得
	if(Seq>n){
		return -1;
	}else{
	int no=0;
	//SimilarWord=word[hisbrother[Seq-1]];//额,预先有位置,不能改
	//要获得排序后的兄弟单词的序号,简单的计算方法,企图用26进制计算大小。。。。失败,数太大,无法计算
	//使用冒泡算法
	char *a;//较小值,
	char *b;//用于排序,
	int use;//排序时,不是排字符数组,而是拍兄弟单词序号数组
	for(int i=0;i<Seq;i++){//需要第几位,就应该取第几位的最小值
		
		for(int j=n-1;j>0;j--){//从后向前遍历数组	
			a=word[hisbrother[j]];
			b=word[hisbrother[j-1]];
			for(int k=0;k<wordlength[hisbrother[j]];k++){//循环比较每一个字母大小
			if(*a<*b){
				use=hisbrother[j];
				hisbrother[j]=hisbrother[j-1];
				hisbrother[j-1]=use;
				break;
			}else if(*a>*b){
				
				break;
			}else{
				a++;
				b++;//比较下一个字母
			}
			}
		}
	}
	no=hisbrother[Seq-1];//完成排序,直接使用
	int length=wordlength[no];//获得长度
	length++;//要有‘\0'
	for(int i=0;i<length;i++){
		*SimilarWord=word[no][i];
		SimilarWord++;
	}
	SimilarWord-=length;
	return 0;
	}
}

/******************************************************************************
原    型:void ClearAllWords(void);
功    能:清空字典中所有单词
输入参数: 
          无
输出参数:
          无
返回值:
          无

*******************************************************************************/
void ClearAllWords(void)
{
	for(int i=0;i<counts;i++){
		for(int j=0;j<wordlength[i];j++){
			word[i][j]='\0';//清空字符串数组
		}
	}
	//其他数组没必要清空
	counts=0;

    /* 在这里实现功能 */
}

有两个用例未通过,暂时不知道什么地方出错。


不行,我不能忍,我必须知道用例是什么,得想个办法搞到用例。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics