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 件)

    しばらくお待ちください。
    入力されたコメントは長すぎます。短くしてください。
    何も入力されていません。もう一度やり直してください。
    現在、コメントを追加できません。後でもう一度やり直してください。
    コメントと書くには、保護者 (ほごしゃ) の方の許可 (きょか) をもらってください。許可をリクエストする
    保護者 (ほごしゃ) の方が、あなたがコメントを書けないようにしています。
    現在、コメントを削除できません。後でもう一度やり直してください。
    1 日に投稿できるコメントの最大数を超えました。24 時間経過してから、もう一度やり直してください。
    あなたが他のユーザーに対して迷惑行為を行っている可能性があると確認されたため、お使いのアカウントによるコメントの投稿を無効にしています。誤って無効にされたと思われる場合は、Windows Live のサポートにお問い合わせください。
    コメントを投稿する前に、以下のセキュリティ チェックを完了してください。
    セキュリティ チェックに入力する文字は、画像に表示されている文字または音声で流れた文字と一致していなければいけません。

    コメントを投稿するには、お使いの Windows Live ID でサインインしてください (Hotmail、Messenger、または Xbox LIVE を既に使用している場合は、そのアカウントが Windows Live ID です)。サインイン


    Windows Live ID をお持ちでない場合は、アカウントを新規登録してください。

    9 月 5 日
    9 月 8 日
    名前なしさんの投稿:
    wow gold!All wow gold US Server 24.99$/1000G on sell! Cheap wow gold,wow gold,wow gold,Buy Cheapest/Safe/Fast WoW US EU wow gold Power leveling wow gold from the time you World of Warcraft gold ordered! wow power leveling wow power leveling power leveling wow power leveling wow powerleveling wow power levelingcheap wow power leveling wow power leveling buy wow power leveling wow power leveling buy power leveling wow power leveling cheap power leveling wow power leveling wow power leveling wow power leveling wow powerleveling wow power leveling power leveling wow power leveling wow powerleveling wow power leveling buy rolex cheap rolex wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling wow power leveling -318148670756894
    6 月 21 日
    1 月 17 日
    li xiongさんの投稿:
    评论里面的代码是修改后的,主题里面的代码肯定有错,不知道害人了没有,嘿嘿
    12 月 6 日
    li xiongさんの投稿:
    #define STR1SMALL 1
    #define STR2SMALL -1
    #define EQUAL 0
    int InABC(char p)
    {
         if(p>='A' && p<='Z')
             return true;
         return false;
    };
     
    int InNumber(char p)
    {
         if(p>='0' && p<='9')
             return true;
         return false;
    };
    int MixCompare(const char *str1, const char *str2)
    {
     assert(str1);
     assert(str2);
     while(1)
     {
      while(*str1==*str2 && InABC(*str1))
      {
       str1++;
       str2++;
      }
      if(*str1==0 && *str2==0)
       return EQUAL; //"abc" "abc"
      if(*str1==0)
       return STR1SMALL; //"abc" "abcd"
      if(*str2==0)
       return STR2SMALL; //"abcd" "abc"
      if(InABC(*str1) && InABC(*str2))
       return *str1<*str2?STR1SMALL:STR2SMALL; //"abcd" "abce"
      if(InABC(*str1))
       return STR2SMALL; //"abcd" "abc1"
      if(InABC(*str2))
       return STR1SMALL; //"abc1" "abcd"
      unsigned int str1leadingzero=0;
      unsigned int str2leadingzero=0;
      while(*str1=='0')
      {
       str1leadingzero++;
       str1++;
      }
      while(*str2=='0')
      {
       str2leadingzero++;
       str2++;
      }
      while(*str1==*str2 && InNumber(*str1))
      {
       str1++;
       str2++;
      }
      if(!(InNumber(*str1)|| InNumber(*str2)))
      {
       if(str1leadingzero==str2leadingzero)
        continue; //"abc0011d" "abc0011d"
       return str1leadingzero<str2leadingzero?STR1SMALL:STR2SMALL; //"abc0011d" "abc011d"
      }
      if(!InNumber(*str1))
       return STR2SMALL; //"abc001c" "abc00012"
      if(!InNumber(*str2))
       return STR1SMALL; //"abc00012" "abc001c"
      int retval=*str1<*str2?STR1SMALL:STR2SMALL;  
      while(InNumber(*str1) && InNumber(*str2))
      {   
       str1++;
       str2++;
      }
      if(InNumber(*str1))
       return STR2SMALL; //"abc0011" "abc0001"
      if(InNumber(*str2))
       return STR1SMALL; //"abc0001" "abc0011"
      return retval; //"abc0011" "abc00012"
     }
    }
    12 月 6 日
    彭 韬さんの投稿:
    为什么要我进来啊?要我说那就只能是两个都无聊………………
    5 月 30 日
    魏 梦晓さんの投稿:
    我把猎头看成了猪头
    5 月 29 日
    W. Bonnieさんの投稿:
    pt快进来
    评评理
    是抢沙发的人无聊
    还是自己抢沙发的人更无聊!
    5 月 24 日
    li xiongさんの投稿:
    自己先抢sf
    哼!
    5 月 23 日

    トラックバック (2 件)

    この記事のトラックバックの URL は次のとおりです。
    http://eparg.spaces.live.com/blog/cns!59BFC22C0E7E1A76!929.trak
    この記事を参照しているブログ