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

QQ面试题目,证答案!

楼主flyinger(风往北吹)2005-05-22 20:42:52 在 C/C++ / C++ 语言 提问

char   *p指向一个C-style字符串;要求实现把字符串反转!  
  问:  
  1:效率最佳?  
  2:空间最佳? 问题点数:0、回复次数:58Top

1 楼flyinger(风往北吹)回复于 2005-05-22 20:45:17 得分 0

1:我的思路是能不能只扫描一遍就解决问题呢;这可能就是最佳的思路!  
  2:我的思路是找出长度,然后让首尾对换不就可以了;Top

2 楼flyinger(风往北吹)回复于 2005-05-22 20:47:11 得分 0

第一种没有想到合适的算法Top

3 楼foochow(无聊,灌水......)回复于 2005-05-22 21:00:58 得分 0

1.第一个字符开始扫描,把字符串倒着赋值给另一个字符串char*q,最后p=q,.....输出P.  
  2.首尾对换...  
  不知道这样可不可以^_^Top

4 楼lbing7(向青润老大学习!!!)回复于 2005-05-22 21:03:35 得分 0

//p指向一个C形字符串  
  char   *q   =   p;  
   
  int   Leg   =   strlen(p);  
  char   c;  
   
  for   (int   i   =   1;   i   <=   Leg/2;   i++,p++)  
  {  
              c   =   *p;  
              *p   =   *p[Leg-i];  
              *p[Leg-i]   =   c;  
  }  
   
  这个行不/?  
  Top

5 楼foochow(无聊,灌水......)回复于 2005-05-22 21:04:03 得分 0

别丢我鸡蛋啊,Top

6 楼sunman1982(冥王星)回复于 2005-05-22 21:42:16 得分 0

上上楼的应该是空间最省的算法了吧……至于效率   再想想……Top

7 楼adie20018u8(阿呆)回复于 2005-05-22 21:47:10 得分 0

找长度就遍历了一遍字符串了,效率呀..Top

8 楼sunman1982(冥王星)回复于 2005-05-22 21:49:07 得分 0

所以才是空间最省的啊     只用了len+1个Top

9 楼cao12m(★草上飞★)回复于 2005-05-22 21:52:02 得分 0

意思不懂得?       是不是既要效率最佳还要空间最佳   可是二者是有冲突的   效率最佳:进栈出来    
  空间最佳:   首尾兑换不过这个好象用指针不好实现   要通过解析成数组方式存放才行Top

10 楼cppprogramlover(爱相随—)回复于 2005-05-22 22:00:05 得分 0

//p指向一个C形字符串  
  char   *q   =   p;  
   
  int   Leg   =   strlen(p);  
  char   c;  
   
  for   (int   i   =   1;   i   <=   Leg/2;   i++,p++)  
  {  
              c   =   *p;  
              *p   =   *p[Leg-i];  
              *p[Leg-i]   =   c;  
  }  
   
  这个行不/?  
   
  这个什么效率,strlen费时间Top

11 楼sunman1982(冥王星)回复于 2005-05-22 22:05:26 得分 0

楼上,这个是空间最省的代码……Top

12 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-05-22 22:08:46 得分 0

//p指向一个C形字符串  
  char   *q   =   p;  
   
  int   Leg   =   strlen(p);  
  char   c;  
   
  for   (int   i   =   1;   i   <=   Leg/2;   i++,p++)  
  {  
              c   =   *p;  
              *p   =   *p[Leg-i];  
              *p[Leg-i]   =   c;  
  }  
   
  这个行不/?  
  ----------  
  偶也只会写个这样的^_^Top

13 楼c_nestor()回复于 2005-05-22 22:22:35 得分 0

高效率的解法了?Top

14 楼zdy_8212(zdy_8212)回复于 2005-05-22 22:23:35 得分 0

给出两个指针,将*p1=&str,p2='\0'   while(*p2++   =   *p1++)  
  2.给一个指针,*p1=&str,len=length(str);   while(p[len--]=p++);  
  没有测,修改吧。呵。。Top

15 楼yujianlina()回复于 2005-05-22 22:47:06 得分 0

char   *q   =   p;  
  int   Len   =   strlen(p);  
  char   *q1=null;  
  char   c;  
  q1=Len+1;  
  while(q!=q1)  
  {c=*p;  
  *p=*q1;  
  *q1=c;  
  q++;q1--;  
  }  
  行不Top

16 楼jasonnbfan()回复于 2005-05-22 23:33:41 得分 0

 
  int   num,str_len;  
  char   s[]="I   love   you!";  
  str_len=strlen(s);  
  char   *str_s=&s[0];                         //字符串头位置  
  char   *str_e=&s[len-1];               //字符尾位置  
   
   
  while(1)  
  {  
  count++;  
  if(str_e-str_s<=0)       //比较位置  
  break;  
  num=abs(*str_s-*str_e);         //处理2个字符的差,进行加减处理  
  *str_s>*str_e?(*str_s-=num,*str_e+=num):(*str_s+=num,*str_e-=num);  
  ++str_s;  
  --str_e;  
  }  
   
  写了一个不知道行不行.Top

17 楼MagicCarmack(MagiC++)回复于 2005-05-23 02:43:36 得分 0

//p指向一个C形字符串  
  char   *q   =   p;  
   
  int   Leg   =   strlen(p);  
  char   c;  
   
  for   (int   i   =   1;   i   <=   Leg/2;   i++,p++)  
  {  
              c   =   *p;  
              *p   =   *p[Leg-i];  
              *p[Leg-i]   =   c;  
  }  
   
  这个行不/?  
  ----------  
  偶也只会写个这样的Top

18 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2005-05-23 04:09:39 得分 0

void   reverse(char*   fwd_ptr)  
  {  
          char*   bk_ptr   =   fwd_ptr;  
           
          while(*bk_ptr++   !=   '\0');  
          bk_ptr   -=   2;  
   
          int   len   =   (bk_ptr   -   fwd_ptr   +   1)>>1;  
           
          char   temp;  
          for(;len--;   --bk_ptr,   ++fwd_ptr)  
          {  
                  temp   =   *bk_ptr;  
                  *bk_ptr   =   *fwd_ptr;  
                  *fwd_ptr   =   temp;  
          }  
  }  
   
  我觉得这道题很怪异!Top

19 楼zeeeitch(小浩)回复于 2005-05-23 09:26:17 得分 0

char*   fun(char*   str,   size_t   len)  
  {  
  for   (   int   i=0;i<len/2;++i)  
  {  
  str[i]=str[i]^str[len-i-1];  
  str[len-i-1]=str[i]^str[len-i-1];  
  str[i]=str[i]^str[len-i-1];  
  }  
   
  return   str;  
   
  }  
  Top

20 楼zeeeitch(小浩)回复于 2005-05-23 09:27:18 得分 0

char*   fun(char*   str,   size_t   len)  
  {  
  for   (int   i   =   0;   i   <   len   /   2;   ++i)  
  {  
  str[i]   =   str[i]   ^   str[len   -   i   -   1];  
  str[len   -   i   -   1]   =   str[i]   ^   str[len   -   i   -   1];  
  str[i]   =   str[i]   ^   str[len   -   i   -   1];  
  }  
   
  return   str;  
  }Top

21 楼tuxw(醉书生)回复于 2005-05-23 09:56:07 得分 0

char   *p;  
  char   *q   =   p;  
   
  while(*q)  
          q++;  
  q--;  
   
  while(q   >   p)  
  {  
          *p   ^=   *q   ^=   *p   ^=   *q;  
          p++;  
          q--;  
  }Top

22 楼xzgyb(老达摩)回复于 2005-05-23 09:58:32 得分 0

void  
  reverse(   char   *   str   )  
  {  
  if   (   str   )  
  {  
  char*   end   =   str;  
   
  while   (   *++end   )  
  ;  
   
  for   (   --end;   str   <   end;   ++str,   --end   )  
  {  
  if   (   *str   !=   *end   )  
  {  
  char   tmp   =   *str;  
  *str           =   *end;  
  *end           =   tmp;  
  }  
  }  
  }  
  Top

23 楼zqpsswh(似水无痕)回复于 2005-05-23 10:02:35 得分 0

效率最佳  
   
  开辟一块足够大内存  
   
  *p=new   char   [1000]  
   
  p=p+1000;  
  p='\0'  
  while(*--p=*str++);  
   
  空间浪费严重@@  
   
   
  空间最佳  
   
  创建两个指针    
  扫描一次数组  
  fp指向开头  
  ep指向末尾  
   
  while(fp<ep)  
  {  
        char   temp;  
        temp   =   *fp;  
        *fp=*ep;  
        *ep=temp;  
        fp++;  
        ep--;  
  }  
  Top

24 楼Shatty(西北游侠)回复于 2005-05-23 10:33:40 得分 0

各位厉害,顶!!!Top

25 楼jackyhubin(想吃三明治)回复于 2005-05-23 11:35:03 得分 0

1.取字符串长度,取到尾地址,输出时反向就行了,反正指针也就是找一个地址,这样可能最有效率  
  2.不知道要怎么整,空间怎么定义?Top

26 楼yuanyou(元友)回复于 2005-05-23 12:54:03 得分 0

一时想不到其它的了Top

27 楼ltc_mouse(野地芳菲)回复于 2005-05-23 13:58:11 得分 0

zqpsswh(似水无痕)   给出的,效率确实很高  
   
  不过new出的这个p怎么回收是个问题呀,有memory   leak的高效率意义也不大...Top

28 楼du51(郁郁思扬)回复于 2005-05-23 14:54:54 得分 0

strrevTop

29 楼caiyujian(菜菜虫)回复于 2005-05-23 15:29:05 得分 0

呵呵!都是高手哈。。。。我是才来的!希望以后大家多多指教!Top

30 楼Wolf0403(废人:独活十年~心如刀割)回复于 2005-05-23 15:34:29 得分 0

zqpsswh(似水无痕)     的方法一:不仅空间浪费,而且,如果字符串长度大于   1000,还可能导致溢出  
  方法二:两个指针都多余。只要一个   size_t   保存一下   strlen   的结果就可以用数组操作的方式解决,还节省了   4bytes  
   
  应该有更好的办法。Top

31 楼tuxw(醉书生)回复于 2005-05-23 15:49:17 得分 0

得到   size_t   需要调用   strlen   函数,大概的算法也是用一个指针遍历字符串  
   
  和我前面的这段码时间消耗差不多,还要付出函数调用的开销  
  while(*q)  
          q++;  
  q--;  
   
  而用   size_t   来循环的话需要一个循环计数变量  
  每次根据循环变量计算地址也会带来效率的损失  
   
  没有使用两个指针操作来得快  
  while(q   >   p)  
  {  
          *p   ^=   *q   ^=   *p   ^=   *q;  
          p++;  
          q--;  
  }  
  Top

32 楼llf_hust()回复于 2005-05-23 16:54:18 得分 0

void   Invert(char   *s)  
  {  
              if(*s)  
                    Invert(s+1);  
                    putchar(*s);  
  }Top

33 楼yunlang187(零度寂寞)回复于 2005-05-23 17:07:37 得分 0

!Top

34 楼garlandz(流星街★童虎)回复于 2005-05-23 18:41:11 得分 0

看STL里的代码。Top

35 楼c_nestor()回复于 2005-05-23 20:44:43 得分 0

赞同醉书生的看法Top

36 楼aaasng()回复于 2005-05-23 21:33:41 得分 0

内存条倒插Top

37 楼aaasng()回复于 2005-05-23 21:33:56 得分 0

错了  
  Top

38 楼nlstone(天外流星)回复于 2005-05-23 22:13:36 得分 0

"内存条倒插"  
  绝!  
   
  1   由于题目未给出字串长度,所以new新空间直接保存字串的方案不可靠,最可靠的还是只有用堆栈来解,虽然效率相对差些,但一定可解出正确答案,而单纯地new空间来保存新字串不一定可解出正确答案(溢出)  
  2   显然只能首尾交换了,用一个size_t来保存长度和增加一个指针的空间消耗是一样的,考虑到效率,还是用指针的好Top

39 楼kobefly(科比--网络学习中)回复于 2005-05-23 22:58:46 得分 0

关于第一个问题,我也没想出好办法  
   
  但第2个,首位交换,但你们都用了一个temp的char  
   
  其实这个可以用c-style字符串的结束符'\0'来保存,作为临时变量的存储地址,这样就不要另开辟一个char了  
   
  个人意见Top

40 楼hcann(十年磨一贱~~~)回复于 2005-05-24 07:59:11 得分 0

上面的效率最佳问题,还是在c里嵌套汇编好...  
              组合语言,或许是最快的吧!Top

41 楼lonelyforest(一生所爱)回复于 2005-05-24 08:37:34 得分 0

直接用汇编不是更好吗?效率高,空间用的也少,   或者,直接用机器语言也好,那才叫好呢!Top

42 楼xawi2000()回复于 2005-05-24 09:09:10 得分 0

 
  char   *   fun(char   *p)  
  {  
        char   *q;  
        strcpy(q,p);  
        while(*q)  
        q++;  
        q--;  
   
        while(*p)  
      {  
          *q=*p;  
          p++;  
          q--;  
      }  
   
  }  
   
  不要骂我哟~~Top

43 楼xawi2000()回复于 2005-05-24 09:09:44 得分 0

还掉了一句return   q;Top

44 楼crasy1984(hunter)回复于 2005-05-24 10:11:37 得分 0

请问下,^=这个是什么运算符啊?Top

45 楼valetine(鸣人)回复于 2005-05-24 12:34:09 得分 0

位运算吧!Top

46 楼mostideal(三甲)回复于 2005-05-24 13:35:25 得分 0

呵呵,,还很热闹呀。。  
  继续。。Top

47 楼yangjundeng(天下无双)回复于 2005-05-24 18:02:50 得分 0

我能写好这个,也不见得我就能写好软件。Top

48 楼hj008(catch jjhou)回复于 2005-05-24 18:15:29 得分 0

我个人觉得时间最佳的方法就是再建立一个数组,然后把字符串倒着copy到里面去.  
   
  空间最佳吗?没想到什么特别好的办法.Top

49 楼itlive(好友(暂别VB版))回复于 2005-05-24 18:36:49 得分 0

可以用异或的方法,具体的没想太好Top

50 楼alec626(月吻长河Blog:spaces.msn.com/filebase)回复于 2005-06-02 00:04:45 得分 0

腾讯又不做嵌入式,这点效率的提高没多大意思吧  
  依我看,代码的可读性、可维护性更重要!Top

51 楼viewpl(下了军令状,明年泡不到mm就提着向下小JJ回家叩见祖宗)回复于 2005-06-02 00:44:12 得分 0

面试题可以使用c++标准库吗  
   
   
  #include   <iostream>  
  #include   <stack>  
  #include   <string>  
   
  int   main(int   argv,   char   *   argc[])  
  {  
  using   namespace   std;  
  stack<char>   stk;  
  char   str[10];  
  strcpy(str,   "12345");  
  cout   <<   "Begin   convert   :\n";  
  cout   <<   "str   :   "   <<   str   <<   endl;  
   
  char   *   lp   =   NULL;  
  lp   =   str;  
   
  int   i   =   0;  
  while((*lp   !=   '\0')    
  &&   (i   <   10))    
  {  
  stk.push(*lp);  
  ++lp;  
  ++i;  
  }  
  i   =   0;  
  while((!stk.empty())  
  &&   (i   <   10))  
  {  
  str[i]   =   stk.top();  
  stk.pop();  
  ++i;  
  }  
  cout   <<   "After   convert   :\n";  
  cout   <<   "str   :   "   <<   str   <<   endl;  
  return   0;  
  }  
   
   
  Top

52 楼flyinger(风往北吹)回复于 2005-06-02 10:39:00 得分 0

面试失败,但是还是想知道答案!Top

53 楼cutestar(猪哥靓)回复于 2005-06-02 11:24:01 得分 0

把你能想到的解决方法先写出来,然后再到网上去找找(主要是找源代码,LINUX下的应该有),最后进行比较,很有可能1和2的答案是同一种算法。  
  得到结果固然重要,但解决问题的过程也是很重要的。  
  另外,在反转的同时要注意双字节的问题,如“C编程”,反转后为“程编C”(根据要求和算法定,但要考虑)。  
  Top

54 楼kurt8276(扑火蝶)回复于 2005-06-02 11:26:41 得分 0

用栈Top

55 楼jlkzzh(一阵风)回复于 2005-06-02 11:36:57 得分 0

只要注意  
  c-style字符串的结束符'\0'来保存  
  效率高要考虑其他变量  
  空间小要从本身出发Top

56 楼ywhimis(醉人)回复于 2005-06-02 11:48:30 得分 0

可以用   STL的算法吗?  
  string   strtmp(   szBuf   );/*szBuf是C的字符串*/  
  reverse(   strtmp.begin()   ,   strtmp.end()   );  
  strcpy(   szBuf,   strtmp.data()   );Top

57 楼UnrealImagecoffee(micr - dev)回复于 2005-06-02 14:38:54 得分 0

可以用   STL的算法吗?  
  string   strtmp(   szBuf   );/*szBuf是C的字符串*/  
  reverse(   strtmp.begin()   ,   strtmp.end()   );  
  strcpy(   szBuf,   strtmp.data()   );  
   
  //   goodTop

58 楼wosirius(神经第六)回复于 2005-06-02 14:54:28 得分 0

markTop

相关问题

  • 面试题目……
  • 面试题目
  • 面试题目
  • 面试题目
  • 一面试题目
  • 面试的题目
  • VC面试题目??
  • 那个外企面试题目的答案(因为是我出的题目)其实很简单的!
  • 今天面试.net开发组的面试题目。请大家给出下面几个题目的答案。谢谢!
  • 我是菜鸟!面试题目,今天没做出来,但是希望得到答案。

关键词

  • 字符串
  • 效率
  • 答案
  • 首尾
  • fwd
  • 保存
  • bk
  • 空间
  • 指向
  • 长度

得分解答快速导航

  • 帖主:flyinger

相关链接

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

广告也精彩

反馈

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