设为首页 收藏本站
查看: 1318|回复: 0

[经验分享] 华为练习2 查找兄弟单词

[复制链接]

尚未签到

发表于 2016-6-6 11:03:47 | 显示全部楼层 |阅读模式
/******************************************************************************
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]=*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==wordlength[counts]){//首先字数相等,才可能相同
for(int j=0;j<wordlength[counts];j++){
if(word[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=0;//字母数量数组
for(int i=0;i<51;i++){
WORD=*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==length){//当字数相同时,来进行判断
for(int j=0;j<26;j++){//遍历,判断26个字母数分别是否相同
need=CharNum[j];
isb=true;
for(int k=0;k<length;k++){
if(word[k]==j+97)need--;//每当匹配到相同字母,则need减一
}
if(need!=0){//字母数相等则继续判断,不等,则跳出,不是兄弟
isb=false;
break;
}
}
if(isb){
for(int j=0;j<length;j++){
if(word[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];
SimilarWord++;
}
SimilarWord-=length;
return 0;
}
}
/******************************************************************************
原    型:void ClearAllWords(void);
功    能:清空字典中所有单词
输入参数:

输出参数:

返回值:

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

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

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-226998-1-1.html 上篇帖子: c++ 华为练习五 内存文件系统 下篇帖子: 华为内部的Web安全原则
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表