| xiong さんのプロフィール共享空间标题フォトブログリスト | ヘルプ |
|
5月23日 一个C++猎头笔试题目最近某猎头朋友在网上给我同学出了一个笔试题目,顺便让他发给我看了看,如下:
两个字符串(字符串1、字符串2)的大小比较,字符串可能既含有字符(a~z)又含有数字(0~9)。
比较规则: (1) 从左到右分离单纯的子字符串(全字符)和子数字串(全数字)进行比较。 (2) 如果被比较的都是子字符串,则可以调用strcmp比较子字符串大小。 (3) 如果被比较的都是子数字串,则根据值比较大小,如果值相等,则子数字串短的一方大(前面的0少)。 (4) 如果被比较的一边是子数字串,一边是子字符串,则子字符串大。 写一个int MyCompareText(char *p1, char *p2)函数,不能用递归,符合上面条件,并用一个测试程序,测试这个函数。 测试例子,A1,A01,A2,A11大小顺序将是A01,A1,A2,A11。 写完程序后,请写出正常态和异常态的test case,做成一份测试报告。 题目没有限定时间,工具。总共花了14分钟,在notepad上完成如下代码。在VC下测试,解决几个编译错误后,结果居然一次通过。最近rp真是好啊:
#define p1_is_bigger 1 #define p2_is_bigger -1 #define equal 0
int InABC(char p) { if(p>='A' && p<='Z') return true;
if(p>='a' && p<='z') return true;
return false; };
int InNumber(char p) { if(p>='0' && p<='9') return true; return false; };
int foo(char *p1, char *p2) { int p1index=0; int p2index=0; while(1) { while(p1[p1index]==p2[p2index] && InABC(p1[p1index])) { p1index++; p2index++; }
if(p1[p1index]==0 && p2[p2index]==0) return equal;
if(p1[p1index]==0) return p2_is_bigger;
if(p2[p2index]==0) return p1_is_bigger;
if(InABC(p1[p1index]) && InABC(p2[p2index]) ) if( p1[p1index]>p2[p2index]) return p1_is_bigger; else return p2_is_bigger;
int p1leading0=0; int p2leading0=0;
while(p1[p1index++]=='0') p1index++;
while(p2[p2index++]=='0') p2index++;
int flag=equal; while(InNumber(p1[p1index]) && InNumber(p2[p2index])) { if(p1[p1index]>p2[p2index]) flag=p1_is_bigger; if(p1[p1index]<p2[p2index]) flag=p2_is_bigger;
p1index++; p2index++; }
if(!InNumber(p1[p1index]) && !InNumber(p2[p2index])) //no further digist detected! { if(flag!=equal) return flag;
if(p1leading0!= p2leading0) if(p1leading0>p2leading0) return p1_is_bigger; else return p2_is_bigger;
} else { if(InNumber(p1[p1index])) return p1_is_bigger; else return p2_is_bigger; } } } void testcase(char *p1, char *p2) { printf("%s\n%s\n",p1,p2); printf("%d\n\n",foo(p1,p2)); };
int main(int argc, char* argv[]) {
testcase("",""); testcase("abc","abc"); testcase("abc","ab"); testcase("abc","bca");
testcase("abc123","abc123"); testcase("abc0123","ab00123"); testcase("abc","abc123"); testcase("abc0123","abc124");
testcase("abc123abc","abc123abc"); testcase("abc123abc","abc123ab"); testcase("abc123abc","abc123bca");
return 0; }
http://spaces.msn.com/eparg/blog/cns!59BFC22C0E7E1A76!929.entry
コメント (10 件)
トラックバック (2 件)この記事のトラックバックの URL は次のとおりです。 http://eparg.spaces.live.com/blog/cns!59BFC22C0E7E1A76!929.trak この記事を参照しているブログ
|
|
|