您的位置:首页 > 其它

排序检索-156 Ananagrams-待处理问题为char** p、 char (*p) [n]、char *p[n]的异同

2016-08-07 17:27 375 查看
题目大意:给一串单词,找出不能依靠变换字母顺序就得到新的单词的单词

解题过程:本次qsort char二维数组成功!!!!

值得注意的是:




int cmpchar(const void * a,const void * b){
return strcmp(*(char(*)[30])a,*(char(*)[30])b);
}


与网上的*(char**)a-*(char**)b不同。我的char二维数组定义为:char (*result)[30]=new char[numofword-start][30];后经过尝试发现:二维数组定义为char result[1005][30]; 应用cmpchar()进行快排也是正确的。

char** p、 char (*p)
、char *p
是不同的,但是具体哪里不同还在体会中。。。

易错点:由于输入时大小写不限定,有时候会出现 exit 和 Exit的情况,但这种不算字母重组,要去掉

正确代码:

# include <cstdio>
# include <cstdlib>
# include <ctime>
# include <cmath>
# include <iostream>
# include <fstream>
# include <cstring>
# include <string>

//*
#define fin cin
#define fout cout
//*/

using namespace std;

/*
ifstream fin("in.txt");
ofstream fout("out.txt");
//*/
int cmp(const void* a,const void * b){
return (*(char*)a)-(*(char*)b);
}
/*
int cmpchar(const void* a,const void*b){
char* sa=(char*)a;
char* sb=(char*)b;
for(int i=0;i<min(strlen(sa),strlen(sb));i++){
if(sa[i]<sb[i]) return -1;
if(sb[i]<sa[i]) return 1;
}
if(strlen(sa)>strlen(sb)) return 1;
if(strlen(sb)>strlen(sa)) return -1;
return 0;
}
void sort(char (*s)[30],int num){
char temp[30];
for(int i=0;i<num;i++){
for(int j=num-1;j>i;j--){
if(cmpchar(s[i],s[j])>0){
strcpy(temp,s[i]);
strcpy(s[i],s[j]);
strcpy(s[j],temp);
}
}
}
}
//*/

//*
int cmpchar(const void * a,const void * b){ return strcmp(*(char(*)[30])a,*(char(*)[30])b); }
//*/
/*
int cmpchar(const void * a,const void * b){
return strcmp(*(char**)a,*(char**)b);
}
*/
struct word{
char origine[30];
char lower[30];
char transf[30];
word(){
strcpy(origine,"");
strcpy(transf,"");
}
void tf(){
for(int i=0;i<strlen(origine);i++){
lower[i]=transf[i]=tolower(origine[i]);
}
transf[strlen(origine)]='\0';
lower[strlen(origine)]='\0';
qsort(transf,strlen(transf),sizeof(transf[0]),cmp);
}
};
word words[1005];

int cmpword(const void * a,const void * b){
if(strcmp((*(word*)a).transf,(*(word*)b).transf)!=0)
return strcmp((*(word*)a).transf,(*(word*)b).transf);
else return strcmp((*(word*)a).lower,(*(word*)b).lower);
}
char result[1005][30];
int main()
{
int numofword=0,numofresult=0;
char temp[30];
fin>>temp;
while(strcmp(temp,"#")!=0){
strcpy(words[numofword].origine,temp);
words[numofword].tf();
numofword++;
fin>>temp;
}
qsort(words,numofword,sizeof(words[0]),cmpword);

for(int i=0;i<numofword-1;){
strcpy(temp,words[i].lower);
for(int j=i;j<numofword-1;j++){
if(strcmp(temp,words[j+1].lower)==0){
strcpy(words[j].transf,"");
strcpy(words[j].lower,"");
}
else{
i=j+1;
break;
}
}
}
qsort(words,numofword,sizeof(words[0]),cmpword);

int start=0;

for(int i=0;i<numofword;i++){
if(strcmp(words[i].transf,"")!=0){
start=i;
break;
}
}

// char *result=new char*[numofword-start];
if(numofword-start==1) fout<<words[start].origine<<endl;
else{
if(strcmp(words[start].transf,words[start+1].transf)!=0){
strcpy(result[numofresult++],words[start].origine);
}
for(int i=start+1;i<numofword-1;i++){
if(strcmp(words[i-1].transf,words[i].transf)!=0&&strcmp(words[i].transf,words[i+1].transf)!=0){
strcpy(result[numofresult++],words[i].origine);
}
}
if(strcmp(words[numofword-2].transf,words[numofword-1].transf)!=0){
strcpy(result[numofresult++],words[numofword-1].origine);
}
}
// sort(result,numofresult);
qsort(result,numofresult,sizeof(result[0]),cmpchar);
for(int i=0;i<numofresult;i++){
fout<<result[i]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: