华为笔试过了,面试时又出了一道题 C/C / C语言 - CSDN社区 community.csdn.net

来源:百度文库 编辑:神马文学网 时间:2024/04/29 22:59:24



  我这样做的:先定义一个字符数组,遍历字符串将字符与数组中的字符比较,数组中没有时则将该字符放入其中,另定义一个整数数组,其对应位置放入该字符的个数;如果字符数组中存在该字符则直接在整数数组的对应位置加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++;  
  }  
  }  
   
  }  
 

华为笔试过了,面试时又出了一道题 C/C / C语言 - CSDN社区 community.csdn.net 华为笔试过了,面试时又出了一道题 C/C / C语言 华为笔试过了,面试时又出了一道题 C/C / C语言 华为笔试过了,面试时又出了一道题 C/C / C语言 请问各位大侠:C++的异常处理(try、catch、throw)与C语言的Setjmp()、Longjmp()机制有什么区别?非常感谢! C/C / C 语言 - CSDN社区 community.csdn.net 谁有《C 高级实用程序设计》- C程序汉字显示技术 那一章的源代码 C/C / 非技术区 - CSDN社区 community.csdn.net 一道IBM笔试题,关于结构体sizeof。 C/C / C语言 如何保存SQL的money类型数据。 .NET技术 / VB.NET - CSDN社区 c... NET(C#)连接各类数据库-集锦 - .net - CSDN技术中心 C语言宏的学习: - henry19850318的专栏 - CSDN博客 C语言宏的学习: - henry19850318的专栏 - CSDN博客 C语言字符串函数大全 - amossavez的专栏 - CSDN博客 C语言中最常用标准库函数 - candyliuxj - CSDN博客 有谁用过DLL2Lib?? C/C++ / 工具平台和程序库 - CSDN社区 commu... C#.Net的面试试题 敏捷软件开发11个原则 - (Java/C/Php/C /.NET) (OS,DB,Web,Net,Graph,Game) - CSDN博客 腾讯公司c/c 笔试题 应聘c/c 程序员的笔试题 gzip压缩算法 - c/c - CSDN技术中心 C语言,学去,决定了 如何改变Windows开机时登陆的验证机制 VC/MFC / 基础类 - CSDN社区 community.csdn.net C/C 面试题目 string.h和string不相同,糊涂了。 C/C / C语言 C 常用的Linux C 语言函数库 - 依睛(IT blog) 我回来了,PHPC/C...