CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  新手乐园

一道微创软件公司的笔试题目,大家一起来帮忙

楼主keaneshen()2006-01-11 11:43:42 在 C/C++ / 新手乐园 提问

两个字符串的大小比较,字符串可能含有字符(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

相关问题

  • 求博彦科技的软件测试职位笔试题目!
  • Intel笔试题目
  • 求助:哪位兄弟参加过nec软件的笔试 或者它以前的笔试题目?
  • 推荐Delphi笔试题目
  • 求救:笔试题目
  • 两个笔试题目
  • 群硕笔试题目
  • 中兴笔试题目
  • 请教各位,软件公司面试、笔试的大概内容;有具体题目最佳
  • 求PHP招聘的笔试题目。

关键词

  • 字符
  • 数字
  • 字符串
  • 数字串
  • len
  • 比较
  • 分离
  • ab
  • 相等
  • 大小

得分解答快速导航

  • 帖主:keaneshen
  • 0000000009
  • carp2003

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo