华为笔试过了,面试时又出了一道题 C/C / C语言

来源:百度文库 编辑:神马文学网 时间:2024/04/24 06:15:30
@import url("http://www.csdn.net/ui/styles/public_header_footer.css"); CSDN首页 新闻 论坛 Blog 文档 下载 读书 Tag 搜索 .NET Java 移动 游戏 SD 人才 外包 第二书店 CSDN社区  -  C/C++ / C语言 收藏此页 |  打印 |  关闭窗口

主题关键词

  • 分块
  • 字符
  • 长度
  • 算法
  • int
  • 查找
  • char
  • 个数
  • void
  • 玩命

得分解答快速导航

  • 帖主:zengqianghua1120
  • t_jl1979
  • tianya9704
  • Flood1984
  • sd01101230
  • luckysym
  • Xeric2003
  • shizhen

相关连接

免费注册,和百万程序员交流
  • C/C++ FAQ
  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈.

华为笔试过了,面试时又出了一道题

zengqianghua1120 (强中华)     2005-03-21 09:35:16 在 C/C++ / C语言 提问
题目为:统计一个字符串中字符出现的次数  
  我这样做的:先定义一个字符数组,遍历字符串将字符与数组中的字符比较,数组中没有时则将该字符放入其中,另定义一个整数数组,其对应位置放入该字符的个数;如果字符数组中存在该字符则直接在整数数组的对应位置加1。遍历完字符串时,其包含的字符和字符个数分别放到了两个数组中,到面试人却说该算法过于复杂,请各位给予指点。(以前上学时遇到过,具体如何做的忘了)
问题点数:40、回复次数:43 1楼  t_jl1979   (骑士)  回复于 2005-03-21 10:13:23  得分 5
这个用标准程序库里的map做比较好:  
  #include    
  #include    
  using   namespace   std;  
   
  int   main(){  
  mapword;  
  char   ch;  
  while   (   cin   >>   ch)  
  word[ch]++;  
  map::iterator   it   =   word.begin();  
  for(;it!=word.end;++it){  
  cout   <<   "character:"   <<   it->first   <<     "number:"   <<   it->second   <<   endl;  
  }  
  }  
  现在手里没有工具,调试不了,有可能有错误,大家给看看。  
 
Top2楼  windinn   (颠覆后25时代)  回复于 2005-03-21 10:22:47  得分 0
not   so   difficult
Top3楼  pcboyxhy   (-273.15℃)  回复于 2005-03-21 10:31:12  得分 0
hash一个
Top4楼  bluedodo   (笑三少)  回复于 2005-03-21 10:33:43  得分 0
我也想不出更好的,学习
Top5楼  tianya9704   (流水浮灯)  回复于 2005-03-21 10:34:05  得分 5
void   numOfChar(const   char   *   str)  
  {  
          int   a[58];  
          for(int   i=0;i<58;i++)   a[i]   =   0;  
          for(   ;   str!=NULL;str++)  
          {  
                  int   j   =   *str-65;  
                  if(i<0||i>57)  
                            continue;  
                  a[j]++;  
          }  
  }  
   
  则a[0]~a[25]存储了A~Z的个数,  
  a[32]~a[57]存储了a~z的个数,  
   
  若不区分大小写,则可在最后将两者合并,  
     
  不知道这样做合不合意^_^
Top6楼  Flood1984   (峰子)(好男人 灌就灌出个模样)  回复于 2005-03-21 10:35:34  得分 10
你算法复杂的原因是每个字符都要遍历一次已有字符数组。  
  可以如下解决:  
  建立一个数组:  
  static   int     count[128];  
  遍历字符串数组,  
  每次读取一个字符ch;  
  count[ch]++;  
  这样只要遍历一次数组就行了
Top7楼  sooler   (游园寻梦)  回复于 2005-03-21 10:35:54  得分 0
struct   node  
  {  
   
  }  
  定义一个链表,结点有两个数据域,从头至尾遍历,
Top8楼  tianya9704   (流水浮灯)  回复于 2005-03-21 10:37:02  得分 0
把const   去掉
Top9楼  tianya9704   (流水浮灯)  回复于 2005-03-21 10:39:34  得分 0
哎呀   ,我只统计了a~z,A~Z
Top10楼  yuanyou   (元友)  回复于 2005-03-21 11:01:25  得分 0
学习!
Top11楼  searoom   (海龙)  回复于 2005-03-21 11:06:13  得分 0
觉得用   Flood1984(峰子)(玩命学习网络技术)   的方法比较好  
   
  在最后把   count[i]==0   的去掉即可
Top12楼  liudajun   (Blind Guardian)  回复于 2005-03-21 11:09:51  得分 0
1>根据数组长度确定初始步长n,进行分块查找并逐个统计。  
  2>每当查找出一个元素,统计并删除该元素,观察新数组长度是否小于步长n  
  3>直至数组长度<=n时终止分块查找。  
  4>输出结果  
  算法复杂度:  
  1/2(k/s+s)+1  
  k:数组长度,s:每块记录数目
Top13楼  monkeylove   (monkeylove)  回复于 2005-03-21 11:49:10  得分 0
楼上的算法还行
Top14楼  dongpy   (51-->ARM)  回复于 2005-03-21 11:57:03  得分 0
这个跟遍历图像统计灰度直方图是一个道理。  
   
  方法就是Flood1984(峰子)(玩命学习网络技术)说的那样。
Top15楼  sTigerwsk   (++++++禽兽联合国总理兼国防部长--骗子++++++)  回复于 2005-03-21 12:00:58  得分 0
TCPL上的例题
Top16楼  sd01101230   (一只蚂蚁)  回复于 2005-03-21 15:38:47  得分 0
_lsearch()函数或许对你有帮助,源代码在unix下能变异通过。你去找找吧。
Top17楼  sd01101230   (一只蚂蚁)  回复于 2005-03-21 15:40:57  得分 5
#include   "stdafx.h"  
   
  int   _tmain(int   argc,   _TCHAR*   argv[])  
  {  
        char   *   key   =   "class3";  
  char   *base[6]   =   {"class1","class3","class3","class2","class3","class3"};  
  unsigned   int   n   =   sizeof(base)/sizeof(base[0]),i=0;  
  char   **result1;  
  int   index[6]={0};  
   
  //preview   data;  
  printf(   "base   before   _lsearch:\n"   );  
  for(   i=0;   i  printf(   "\n\n"   );  
   
  //search   char  
  result1   =   (char   **)search(   &key,   base,&n,sizeof(base[0]),index,   compare   );  
   
  printf(   "\n"   );  
  //printf(   "   %d   \n",sizeof(int)   );  
  //print   index   &   string   +=sizeof(char*)  
  if   (n   !=   sizeof(base)/sizeof(base[0])   +10)  
  {  
  printf(   "string     index\n");  
  for(   i=0;   i  printf   ("%s       %d   \n",(char   **)result1[i],index[i]   );  
  }  
   
  getchar();  
  return   0;  
  }  
   
  int   compare(const   void   *   arg1,const   void   *   arg2)  
  {  
  return   (strcmp(*(char   **)arg1,*(char   **)arg2));  
  }  
  void   *   search(const   void   *   key,  
  void   *   base,  
  unsigned   int   *   num,  
  unsigned   int   width,  
  void   *   index,  
  int   (_cdecl   *compare)(const   void   *,const   void   *))  
  {  
  const   char   *pbase,*pelement;  
  const   char   *pback,*psearch;  
  int   counter   =   -1,i   =   0;  
  const   int   *indexback;  
  //DATA   ssearch[6];  
  //base   total   adrress  
  try  
  {  
  pbase   =   (const   char*)   base   +   *num   *   width;  
  //save   pre.Address  
  pback   =psearch=pbase   +   *num   *   width;  
   
  indexback   =   (const   int   *)index;//=(int   *)pback   +   *num   *   sizeof(int   *);  
   
  //psearch   -=width;  
  for   (   pelement   =   (const   char   *)base;   pelement   <   pbase;   pelement   +=width,i++)  
  {  
  if   (!compare(key,(void   *)pelement))  
  {  
  //index   =   &counter;  
  counter   ++;  
  memcpy((void   *)psearch,(void   *)pelement,width);  
  memcpy((void   *)indexback,(void   *)(&i),sizeof(int   *));  
  indexback   ++   ;  
  psearch   +=width;  
  //ssearch[counter].pdata   =   (char   *)pback+width*counter;  
  //ssearch[counter].index   =   i;  
  }  
  }  
  if   (counter   !=-1)  
  {  
  //index   =   indexback;  
  *num   =   ++counter;  
  return   ((void   *)   pback);  
  }  
  else  
  return   (base);  
  }  
  catch   (char   *str)  
  {  
  MessageBox(NULL,     str     ,"",MB_OK);  
  }  
  //return   0;  
  }
Top18楼  tdrhsb   (月亮上砍桂花树的男人)  回复于 2005-03-21 15:52:30  得分 0
Flood1984(峰子)(玩命学习网络技术   是最好的,  
  充分利用了字符性质!  
  UP!  
  受益了!
Top19楼  delhe   ()  回复于 2005-03-21 16:10:54  得分 0
同意Flood1984(峰子)的思路.  
  但是当字符串长度很小的时候,都需要循环比较128次.  
 
Top20楼  luckysym   (热带风暴)  回复于 2005-03-21 16:37:43  得分 5
char   str[1024];  
  int     a[128];                        
  int   i;  
  for(i=0;   i<128;i++)   a[i]   =   0;  
  i=0;  
  while(!str[i])   a[str[i++]]++;  
  for(i=32;   i<128;i++)   printf("%c:   %d\n",   i,   a[i]);
Top21楼  wxdvc   (csdn)  回复于 2005-03-21 16:43:51  得分 0
Flood1984(峰子)(玩命学习网络技术)   (   )    
  牛人啊.
Top22楼  Xeric2003   ()  回复于 2005-03-21 16:49:22  得分 5
int   count[128];     //共128个字符(ASSCII码值为0~127)  
  void   CountChar(char   ch[])  
  {  
  int   i;  
  int   j;  
  for(i=0;ch[i]!='\n';i++)  
  {  
  j=(int)ch[i];  
  count[j]++;  
  }  
  for(i=0;i<128;i++)  
  {  
  printf("%c的次数为%d\n",(char)i,count[i]);  
  }  
  }
Top23楼  wxdvc   (csdn)  回复于 2005-03-21 16:50:50  得分 0
1>根据数组长度确定初始步长n,进行分块查找并逐个统计。  
  2>每当查找出一个元素,统计并删除该元素,观察新数组长度是否小于步长n  
  3>直至数组长度<=n时终止分块查找。  
  4>输出结果  
  算法复杂度:  
  1/2(k/s+s)+1  
  k:数组长度,s:每块记录数目  
   
  那位高人在给解释一下,看不明白啊.
Top24楼  shizhen   (失贞)  回复于 2005-03-21 16:53:41  得分 5
#include    
  using   namespace   std;  
   
  int   main()  
  {  
  int   count[255]   ={0};  
  char   *pstrTemp   =   "243567867867867";  
  do  
  {  
  count[*pstrTemp]++;  
  }while   (*(++pstrTemp));  
  for   (int   i   =   0;   i   <   255;   ++i)  
  {  
  if   (count[i]   !=   0)  
  cout   <<   "character:"   <<   (char)i   <<"   number:"   <<   count[i]   <<   endl;  
  }  
  }
Top25楼  yangvxin1   (小杨)  回复于 2005-03-21 16:57:49  得分 0
int   Char_Num[128];  
  void   InitialArray()  
  {  
  for(int   i=0;i<128;i++)  
                    Char_Num[i]=0;  
  }  
  void   LoopArray(const   char   *p)  
  {  
  char   pp;  
    for(int   i=0;i  {  
                        pp=*(p+i);  
      Char_Num[pp]++;  
  }  
  }  
  void   print()  
  {      
  int   p;  
  for(int   i=0;i<128;i++)  
  {  
        p=Char_Num[i];  
        if(p!=0)  
        {  
                    printf("The   number   of   %c   is   %d",i,p);  
            printf("\n");  
        }  
  }  
  }  
  void   main(void)  
  {  
          InitialArray();  
  LoopArray("aaabbbcccdddeee;;>/??MM^&%*$#@SDVGfffgggaaaiiiiiiiiitryryasfa");  
  print();  
  }  
  哈哈。无聊。觉得。  
 
Top26楼  mymyal123   (风之森)  回复于 2005-03-21 17:58:20  得分 0
学习
Top27楼  visual4825   ()  回复于 2005-03-21 18:41:38  得分 0
学习
Top28楼  iawk   (王卡)  回复于 2005-03-21 18:53:38  得分 0
学习
Top29楼    ()  回复于 2005-03-21 19:36:56  得分 0
学习
Top30楼  Release_yourself   (释放自己)  回复于 2005-03-21 20:01:14  得分 0
学习    
  基本看不懂   !  
 
Top31楼  Iamanders   (日上三竿)  回复于 2005-03-21 20:05:19  得分 0
先排序,然后计数,  
   
  耗时比较长,唯一的就是思路清晰
Top32楼  vickiyan   (蕊儿)  回复于 2005-03-21 20:51:08  得分 0
上面的峰子的思路有没有谁能写出来代码一下哟
Top33楼  pdw2009   (捡垃圾去上网)  回复于 2005-03-21 21:11:23  得分 0
kao这么简单的面试题,,后悔当初放弃C语言.......................  
   
   
 
Top34楼  qifa   ()  回复于 2005-03-21 21:35:53  得分 0
Iamanders(日上三竿)    
  先排序,然后计数,  
   
  耗时比较长,唯一的就是思路清晰  
   
  这样行不行啊--》  
  ///////////////////////////////////////////////////////  
   
  #include    
  #include    
   
  const   BUFFER   =   256;  
  #define   SWAP(a,b)   a^=b^=a^=b;  
  void   main()  
  {  
  char   buf[BUFFER];  
   
  cout<<"请输入字符串[不超过256]:";  
  cin>>buf;  
   
  int   Length,i,j;  
   
  Length   =   strlen(buf);  
  cout<<"总字符:"<  //排序  
  for(i=0;   i  for(j=i;   j  if   (buf[i]   >   buf[j])   SWAP(buf[i],buf[j]);  
  cout<  //统计输出  
  j=1;  
  for(i=0;   i  {  
  if   (buf[i]   !=   buf[i+1])  
  {  
  cout<<"字符:   \'"<  j   =   1;  
  }  
  else  
  {  
  j++;  
  }  
  }  
   
  }  
 
Top35楼  lezi1022   (doyouknowdk)  回复于 2005-03-22 00:07:12  得分 0
所有字符的ascii码是连续的吗?  
  如果连续,直接一遍就行了。  
  字符和   int   是一一对应的。
Top36楼  snakebite2008   (唢呐科比特)  回复于 2005-03-22 02:32:14  得分 0
逐字符的read,当读到未曾读过的字符时,创建动态数组,长度为1,默认值为1,将刚才读的字符压栈,read下一字符,若和栈中字符相等,则动态数组中值增1;若不等,则将原先栈中的值弹出,将新读入的值压栈,动态数组长度增1。然后继续读。然后反复。一次遍历就够了。  
   
  大家觉得呢?
Top37楼    ()  回复于 2005-03-22 10:11:30  得分 0
to:t_jl1979(骑士)  
  主函数怎么返回整型?可以吗?
Top38楼  xnlcx   (J2EE.Net)  回复于 2005-03-22 10:26:46  得分 0
学习学习再学习
Top39楼  wwwzzz8595   ()  回复于 2005-03-22 10:46:49  得分 0
snakebite2008()的方法不错。
Top40楼  zengqianghua1120   (强中华)  回复于 2005-03-22 11:26:42  得分 0
在此感谢各位!真的谢谢你们!
Top41楼    ()  回复于 2005-03-22 11:28:33  得分 0
1>根据数组长度确定初始步长n,进行分块查找并逐个统计。  
  2>每当查找出一个元素,统计并删除该元素,观察新数组长度是否小于步长n  
  3>直至数组长度<=n时终止分块查找。  
  4>输出结果  
  算法复杂度:  
  1/2(k/s+s)+1  
  k:数组长度,s:每块记录数目  
  这方法简单易懂,而且合理。支持大军
Top42楼  wwxxdd1982   (新人)  回复于 2005-03-22 11:44:19  得分 0
高手啊!见识了
Top43楼    ()  回复于 2005-03-22 15:23:40  得分 0
http://www.QQb.cc/Q.htm?qq=820799  
  免费申请6位数的QQ号啦~点击马上申请
Top相关问题
  • 华为笔试过了,面试时又出了一道题
  • 一道华为的笔试题
  • 华为的一道笔试题,想知道它的结果是怎么得出。
  • 今天去华为面试,有一道题是这样的
  • 华为一道面试题(SQL语句填空)
  • 华为的一道经典面试题 求高手给出程序来
  • 华为前两天在电子科大招聘时的一个笔试题:)
  • 华为前两天在电子科大招聘时的一个笔试题:)
  • 昨天去华为面试了,贴几个面试题出来供大家参考
  • 华为面试时,一个较变态的题,无序数组折半查找

网站简介-广告服务-网站地图-帮助信息-联系方式-English-问题报告

CSDN北京百联美达美数码科技有限公司  版权所有  京 ICP 证 020026 号 CSDN

© 2000-04, CSDN.NET, All Rights Reserved