暴风影音2014笔试算法题汇总

1.自定义实现字符串转为整数的算法,例如把“123456”转成整数123456.(输入中可能存在符号,和数字)

[cpp]  view plain copy
  1. //返回结果的有效标志    
  2. enum Status {VALID,IN_VALID};    
  3. int gStatus = VALID;    
  4.     
  5. int strToInt(const char* str)    
  6. {    
  7.     long long result = 0;//保存结果    
  8.     gStatus = IN_VALID; //每次调用时都初始化为IN_VALID    
  9.     if(str != NULL)    
  10.     {    
  11.         const char* digit = str;    
  12.     
  13.         bool minus = false;    
  14.     
  15.         if(*digit == '+')    
  16.             digit++;    
  17.         else if(*digit == '-')    
  18.         {    
  19.             digit++;    
  20.             minus = true;    
  21.         }    
  22.     
  23.         while(*digit != '\0')    
  24.         {    
  25.             if(*digit >= '0' && *digit <= '9')    
  26.             {    
  27.                 result = result * 10 + (*digit -'0');    
  28.                 //溢出    
  29.                 if(result > std::numeric_limits<int>::max())    
  30.                 {    
  31.                     result = 0;    
  32.                     break;    
  33.                 }    
  34.                 digit++;    
  35.             }    
  36.     
  37.             //非法输入    
  38.             else    
  39.             {    
  40.                 result = 0;    
  41.                 break;    
  42.             }    
  43.         }    
  44.     
  45.         if(*digit == '\0')    
  46.         {    
  47.             gStatus = VALID;    
  48.             if(minus)    
  49.                 result = 0 - result;    
  50.         }    
  51.     }    
  52.     
  53.     return static_cast<int>(result);    
  54. }    

2. 给出一棵二叉树的前序和中序遍历,输出后续遍历的结果,假设二叉树中存储的均是ASCII码。如前序:ABDHECFG,中序:HDBEAFCG,则输出后序为: HDECFGCA,改正为:HDECFGBA

思路:先利用前序和中序构建出二叉树,然后后序遍历输出结果

[cpp]  view plain copy
  1. /**  
  2. *返回二叉树的根节点  
  3. *preOrder:前序遍历序列  
  4. *inOrder:中序遍历序列  
  5. *len:节点数目  
  6. */    
  7. Node* getBinaryTree(char* preOrder, char* inOrder, int len)    
  8. {    
  9.     if(preOrder == NULL || *preOrder == '\0' || len<=0)    
  10.         return NULL;    
  11.     
  12.     Node* root = (Node*) malloc(sizeof(Node));    
  13.     if(root == NULL)    
  14.         exit(EXIT_FAILURE);    
  15.     
  16.     //前序遍历的第一个节点就是根节点    
  17.     root->data = *preOrder;    
  18.     
  19.     int pos = 0;//找到根节点在中序遍历中的位置,其值也代表了左子树的节点数目    
  20.     while(true)    
  21.     {    
  22.         if(*(inOrder+pos) == root->data)    
  23.             break;    
  24.         pos++;    
  25.     }    
  26.     
  27.     //通过递归找到左子树和右子树,注意子树的前序中序的下标的计算    
  28.     if(pos == 0)    
  29.         root->lchild = NULL;    
  30.     else    
  31.         root->lchild = getBinaryTree(preOrder+1, inOrder, pos);    
  32.     
  33.     if(len-pos-1 == 0)    
  34.         root->rchild = NULL;    
  35.     else    
  36.         root->rchild = getBinaryTree(preOrder+pos+1, inOrder+pos+1,len-pos-1);    
  37.     return root;    
  38. }    
  39.     
  40. /**  
  41. *后续遍历二叉树  
  42.  
  43. */    
  44. void postOrder(Node* root)    
  45. {    
  46.     if(root == NULL)    
  47.         return;    
  48.     
  49.     postOrder(root->lchild);    
  50.     postOrder(root->rchild);    
  51.     printf("%c", root->data);    
  52. }    
  53.     
  54. /**  
  55. *根据前序遍历和中序遍历输出后续遍历  
  56.  
  57. */    
  58. void printPostOrderViaPreOrderAndInorder(char* preOrder, char* inOrder)    
  59. {    
  60.     Node* root = getBinaryTree(preOrder, inOrder, strlen(preOrder));    
  61.     postOrder(root);    
  62. }    

3. 给出了一个n*n的矩形,编程求从左上角到右下角的路径数(n > =2),限制只能向右或向下移动,不能回退。例如当n=2时,有6条路径。

一是利用数学知识,从左上角到右下角总共要走2n步,其中横向要走n步,所以总共就是C2n~n。

二是利用递归实现

[cpp]  view plain copy
  1. /**  
  2. *返回总路径数  
  3. *参数m:表示矩形的横向格子数  
  4. *参数n:表示矩形的纵向格子数  
  5. */    
  6. int getTotalPath(int m, int n)    
  7. {    
  8.     //如果横向格子数为1,则类似“日”字,此时路径数为纵向格子数加1    
  9.     if(m == 1)    
  10.         return n + 1;    
  11.     //如果纵向格子数为1,此时路径数为横向格子数加1    
  12.     if(n == 1)    
  13.         return m + 1;    
  14.     
  15.     //由于从当前点出发,只能向右或向下移动:    
  16.     //向右移动,则接下来就是getTotalPath(m-1, n)的情形    
  17.     //向下移动,则接下来就是getTotalPath(m, n-1)的情形    
  18.     return getTotalPath(m-1, n) + getTotalPath(m, n-1);    
  19. }    

转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/12209183


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值