2014百度校招笔试题

二、算法与程序设计题(本题共45分)

1. 使用C/C++编写函数,实现字符串反转,要求不使用任何系统函数,且时间复杂度最小,函数原型:char* reverse_str(char* str)。(15分)

 算法实现:

[cpp]  view plain copy
  1. /*实现字符串翻转*/  
  2. char* reverse_str(char* str)  
  3. {  
  4.     if(NULL == str) //字符串为空直接返回  
  5.     {  
  6.         return str;  
  7.     }  
  8.     char *begin;  
  9.     char *end;  
  10.     begin = end = str;  
  11.   
  12.     while(*end != '\0'//end指向字符串的末尾  
  13.     {  
  14.         end++;  
  15.     }  
  16.     --end;  
  17.   
  18.     char temp;  
  19.     while(begin < end) //交换两个字符  
  20.     {  
  21.         temp = *begin;  
  22.         *begin = *end;  
  23.         *end = temp;  
  24.         begin++;  
  25.         end--;  
  26.     }  
  27.   
  28.     return str; //返回结果  
  29. }  
  30. void main()  
  31. {  
  32.     char str[] = "123456";  
  33.     printf(reverse_str(str));  
  34. }  

2. 给定一个如下格式的字符串,(1,(2,3),(4,(5,6),7))括号内的元素可以是数字,也可以是另一个括号,请实现一个算法消除嵌套的括号,比如把上面的表达式变成:(1,2,3,4,5,6,7),如果表达式有误请报错。(15分)

分析:此题实际上考的是站的应用,即曾经练过的括号匹配问题。

算法实现:

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <STACK>  
  3. using namespace std;  
  4.   
  5. /*判断表达式是否合法*/  
  6. bool IsValid(char *str)  
  7. {  
  8.     if(NULL == str) return false;  
  9.   
  10.     stack<char> op;  
  11.   
  12.     while(*str)  
  13.     {  
  14.         if(*str == '(')  
  15.         {  
  16.             op.push(*str++);  
  17.         }  
  18.         else if(*str == ')')  
  19.         {  
  20.             if(op.empty())  
  21.                 return false;  
  22.             else  
  23.                 op.pop();  
  24.             str++;  
  25.         }  
  26.         else  
  27.         {  
  28.             str++;  
  29.         }  
  30.     }  
  31.   
  32.     if(op.empty())  
  33.         return true;  
  34.     else  
  35.         return false;  
  36. }  
  37. /*消除中间的括号*/  
  38. char *Elimination_brackets(char *str)  
  39. {  
  40.     if(str == NULL)  //字符串为空返回  
  41.         return str;    
  42.       
  43.     char* temp = new char[strlen(str)+1];    
  44.     char* result = temp;    
  45.       
  46.     *temp++ = *str++; //跳过第一个左括号  
  47.     while(*str!='\0')    
  48.     {    
  49.         if(*str == ')' || *str=='(')  //有括号,跳过赋值  
  50.         {    
  51.             str++;    
  52.             continue;    
  53.         }    
  54.         *temp++ = *str++;    
  55.     }    
  56.     *temp++ = ')';  //将有括号加上  
  57.     *temp = '\0';    
  58.       
  59.     return result;    
  60.       
  61. }  
  62. void main()  
  63. {  
  64.       char str[] = "(1,(1,0),3)";  
  65.       int a = 0;  
  66.       if(IsValid(str))  
  67.       {  
  68.           printf(Elimination_brackets(str));  
  69.       }  
  70.   
  71. }  


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值