一道微创软件公司的笔试题目,大家一起来帮忙
两个字符串的大小比较,字符串可能含有字符(a--z)和数字(0--9)
比较规则:
(1) 从左到右分离单纯的子字符串(全字符)和子数字串(全数字)进行比较.
(2) 如果两边都是子字符串,则可以调用strcmp比较子字符串大小.
(3) 如果两边都是子数字串,则根据值比较大小,如果值相等,则子数字串短的一方大(前面的0少).
(4) 如果一边是子数字串,一边是子字符串,则子字符串大.
写一个int MyCompareText(char *p1, char *p2)函数,不能用递归,符合上面条件,并用一个测试程序,测试这个函数.
测试例子,A1,A01,A2,A11大小顺序将是A01,A1,A2,A11.
各位大虾,这是微创软件公司的笔试题啊,大家一起来帮帮忙攻克它吧.
问题点数:20、回复次数:22Top
1 楼keaneshen()回复于 2006-01-11 12:51:59 得分 0
自己顶起来,请大家帮帮忙啊Top
2 楼0000000009()回复于 2006-01-11 14:52:02 得分 0
字母范围是大写还是小写,还是大小写都行Top
3 楼cunsh(村少)回复于 2006-01-11 16:21:34 得分 0
怎么还没人做啊.
嘿嘿. 是不是分不够.Top
4 楼jsjjms(专心研究嵌入式)回复于 2006-01-11 16:42:22 得分 0
你的比较算法本身就不好,不过如果一定要按你的比较算法进行比较,
那也是非常简单的。Top
5 楼asdfg014(绝望生鱼片)回复于 2006-01-11 16:59:47 得分 0
题目不明白
如:
char *p1="a123b";
char *p2="ab123";
如何比较?
分离出什么?是p1=("ab","123"),p2=("ab","123")吗?还是p1=("a***b","01230"),
p2=("ab***","00123")?
Top
6 楼keaneshen()回复于 2006-01-11 17:12:52 得分 0
大小写都行啊,
如:
char *p1="a123b";
char *p2="ab123";
如何比较?
分离出什么?是p1=("ab","123"),p2=("ab","123")<-------就是这个,对了
各位大虾帮忙啊,小弟弟不胜感激Top
7 楼cad_vc(雪域之神)回复于 2006-01-11 17:35:25 得分 0
其实就是以文件名(或文件夹名)进行排序。
弄几个文件试试就知道比较规则了。Top
8 楼keaneshen()回复于 2006-01-11 18:34:05 得分 0
顶啊,顶到有高手做出来啊,Top
9 楼chengzanmiao(高薪為共產當多納稅)回复于 2006-01-11 20:32:39 得分 0
首先要做分离这个动作吧.要申请数组来存放吧.Top
10 楼keaneshen()回复于 2006-01-11 21:47:44 得分 0
顶到高人的代码出现!!!!Top
11 楼0000000009()回复于 2006-01-11 23:01:29 得分 10
int f(char* a,char* b)
{
double s1 = 0.0f;
double s2 = 0.0f;
int mark = 0;
char* ta = a;
char* tb = b;
if(*a > 58 && *b < 58) // *a is char *b is int
{
return 1;
}
if(*a < 58 && *a > 58) // *a is int *b is char
{
return -1;
}
if(*a>58)
mark = 1;
while(*a != '\0' && *b != '\0')
{
if(*a > 58 && *b < 58) // *a is char *b is int
{
if(mark)
return 1;
else
return -1;
}
if(*a < 58 && *a > 58) // *a is int *b is char
{
if(mark)
return -1;
else
return 1;
}
if(*a>58 && *b>58) //both char
mark = 1;
else
mark = 0;
if(mark) // char
{
if(*a > *b)
return 1;
if(*a++ < *b++)
return -1;
}
else // int
{
s1 = s2 = 0.0f;
mark = 0;
while(*a<58 && *a>47 || *b<58 && *b>47)
{
if(*a<58 && *a>47)
{
s1 *= 10;
s1 += (*a++) - 48;
}
if(*b<58 && *b>47)
{
s2 *= 10;
s2 += (*b++) - 48;
}
}
if(s1>s2)
return 1;
if(s1<s2)
return -1;
if( (a-ta) > (b-tb) )
return 1;
if( (a-ta) < (b-tb) )
return -1;
}
}
if(*a != '\0')
return 1;
return 0;
}Top
12 楼carp2003(fish)回复于 2006-01-11 23:03:05 得分 10
#include <string.h>
#include <ctype.h>
bool equalType(char a, char b)
{
return isalpha(a) && isalpha(b) ||
isdigit(a) && isdigit(b);
}
int compareLetterString(char* p1, char* t1, char* p2, char * t2)
{
char copy1 = *t1, copy2 = *t2;
*t1 = '\0';
*t2 = '\0';
int res = strcmp(p1, p2);
*t1 = copy1;
*t2 = copy2;
return res;
}
int compareDigitString(char* p1, char* t1, char* p2, char * t2)
{
int len1 = t1 - p1;
int len2 = t2 - p2;
if(len1 > len2)
{
while(len1-- > len2)
{
if(*p1 > '0') return 1;
p1++;
}
}
else if(len2 > len1)
{
while(len2-- > len1)
{
if(*p2 > '0') return -1;
p2++;
}
}
while(p1 != t1 && p2 != t2)
{
if(*p1 > *p2) return 1;
if(*p1 < *p1) return -1;
p1++;
p2++;
}
return 0;
}
int MyCompareText(char* p1, char * p2)
{
if(p1 == NULL)
{
if(p2 == NULL) return 0;
else return -1;
}
else if(p2 == NULL) return 1;
else
{
while(*p1 && *p2)
{
char* t1 = p1+1, *t2 = p2+1;
while(*t1 && equalType(*t1, *p1)) t1++;
while(*t2 && equalType(*t2, *p2)) t2++;
int p = 0;
if(isalpha(*p1))
{
if(isalpha(*p2)) p = compareLetterString(p1, t1, p2, t2);
else return 1;
}
else
{
if(isdigit(*p2)) p = compareDigitString(p1, t1, p2, t2);
else return -1;
}
if(p != 0) return p;
p1 = t1;
p2 = t2;
}
if(!*p1 && *p2) return -1;
else if(*p1 && !*p2) return 1;
else return 0;
}
}Top
13 楼0000000009()回复于 2006-01-11 23:04:47 得分 0
return 0;
应该再加一句
if(*b != '\0')
return -1;
Top
14 楼carp2003(fish)回复于 2006-01-11 23:08:06 得分 0
上面的compareDigitString函数有点问题,应该改为
int compareDigitString(char* p1, char* t1, char* p2, char * t2)
{
int len1 = t1 - p1;
int len2 = t2 - p2;
int lenDiff = len1 - len2;
if(len1 > len2)
{
while(len1-- > len2)
{
if(*p1 > '0') return 1;
p1++;
}
}
else if(len2 > len1)
{
while(len2-- > len1)
{
if(*p2 > '0') return -1;
p2++;
}
}
while(p1 != t1 && p2 != t2)
{
if(*p1 > *p2) return 1;
if(*p1 < *p1) return -1;
p1++;
p2++;
}
// check the length difference
if(lenDiff > 0) return -1;
else if(lenDiff < 0) return 1;
else return 0;
}
Top
15 楼keaneshen()回复于 2006-01-12 00:17:00 得分 0
谢谢两位好心人,太感谢了~~
好心总有好报的~~~~~~Top
16 楼keaneshen()回复于 2006-01-12 00:22:29 得分 0
两人各给10分,请笑纳,呵呵,谢谢两位拉Top
17 楼nale(big frog)回复于 2006-01-12 00:25:07 得分 0
#include <string>
#include <iostream>
using namespace std;
int Mycompare(const char * p1,const char * p2)
{
string p1c,p2c;//存放分离的字符
string p1i,p2i; //存放分离的数字
int i=0;
/****************分离p1********************/
while (p1[i]!='\0')
{
if (p1[i]<='9'&&p1[i]>='0')
{
p1i.push_back(p1[i]);
}
else
p1c.push_back(p1[i]);
i++;
}
i=0;
/**************分离p2****************/
while (p2[i]!='\0')
{
if (p2[i]<='9'&&p2[i]>='0')
{
p2i.push_back(p2[i]);
}
else
p2c.push_back(p2[i]);
i++;
}
/***************比较子字符串*******************/
if (p1c.size()!=0&&p2c.size()!=0&&p1c.compare(p2c)!=0)//字符串都存在且不等
return p1c.compare(p2c);
else
if (p1c.size()!=0&&p2c.size()!=0&&p1c.compare(p2c)==0)//字符串存在且相等
{
if (p1i.size()!=0&&p2i.size()!=0&&p1i.compare(p2i)!=0)//数字串都存在且不等
{
const char *temp1=p1i.c_str();//将string转为const char *
const char *temp2=p2i.c_str();
int i1=atoi(temp1);//将const char *转为int
int i2=atoi(temp2);
if (i1==i2) //数字部分相等
{
if (p1i.size()<p2i.size())
return -1;
else if (p1i.size()==p2i.size())
return 0;
else return 1;
}
else if (i1>i2)
return -1;
else return 1;
}
}
else if (p1c.size()!=0&&p1c.size()==0)
return -1;
else return 1;
}
int main()
{
//A1,A01,A2,A11
cout<<Mycompare("A1","A01")<<endl; // -1
cout<<Mycompare("A1","A2")<<endl; // 1
cout<<Mycompare("A1","A11")<<endl; // 1
cout<<Mycompare("A01","A1")<<endl; // 1
cout<<Mycompare("A01","A2")<<endl; // 1
cout<<Mycompare("A01","A11")<<endl; // 1
cout<<Mycompare("A2","A1")<<endl; //-1
cout<<Mycompare("A2","A01")<<endl; //-1
cout<<Mycompare("A2","A11")<<endl; //1
cout<<Mycompare("A11","A1")<<endl; //-1
cout<<Mycompare("A11","A01")<<endl; //-1
cout<<Mycompare("A11","A2")<<endl; //-1
return 1;
}
对char*不是太熟,在string上操作的,有点画蛇添足了。
Top
18 楼keaneshen()回复于 2006-01-12 00:35:26 得分 0
后面回复的好心人,分数已经给光了,不好意思了,你们的情在下一定会记住的,感激ing~~~Top
19 楼bhut(阿亮)回复于 2006-01-12 00:37:24 得分 0
不明白,如果
左边的子字符串 > 右边的子字符串
左边的子数字串 < 右边的子数字串
算哪个大?Top
20 楼keaneshen()回复于 2006-01-12 00:43:35 得分 0
这里的高手水平真是高,一定要向你们好好学习啊Top
21 楼alizhongren(天外孤星)回复于 2006-01-12 10:23:09 得分 0
同意 "左边的子字符串 > 右边的子字符串
左边的子数字串 < 右边的子数字串
算哪个大?"Top
22 楼nipcdll()回复于 2006-01-12 11:30:12 得分 0
studyingTop




