出题:输入一个整数数组,判断该数组是否符合一个二元查找树的后序遍历(给定整数数组,判定其是否满足某二元查找树的后序遍历);

分析:利用后序遍历对应到二元查找树的性质(序列最后一个元素必定是根节点,从左向右第一个比根节点大的元素开始直到根节点之前的所有元素必定在右子树,之前的所有元素必定在左子树);

解题:

  1. bool PostOrderCheck(int *array, int i, int j) {
  2. /**
  3. * 如快速排序一样,解决小子文件
  4. * */
  5. if(j-i+ == ) {
  6. if(array[i]<=array[i+] && array[i+]<=array[i+])
  7. return true;
  8. else
  9. return false;
  10. } else if(i-i+ == ) {
  11. if(array[i]<=array[i+] || array[i]>=array[i+])
  12. return true;
  13. else
  14. return false;
  15. }
  16.  
  17. int left=i, right=j-;
  18. /**
  19. * 一共有四种情况:指针交叉后跳出,指针未交叉即跳出,left到达最右边,right到达最左边
  20. * 如果第二种情况成立则判定必定失败
  21. * */
  22. while(left<j) {
  23. if(array[left]>array[j])
  24. break;
  25. left++;
  26. }
  27. while(right>=i) {
  28. if(array[right]<array[j])
  29. break;
  30. right--;
  31. }
  32. /**
  33. * 两种特殊情况:只有左子树或者只有右子树的递归
  34. * */
  35. if(left==j || right<i)
  36. return PostOrderCheck(array, i, j-);
  37. /**
  38. * 另外两种跳出情况,break,此时left和right不可能重合
  39. * */
  40. if(left>right) {
  41. /**
  42. * 如果left比right大,说明成功交叉
  43. * */
  44. return PostOrderCheck(array, i, right) || PostOrderCheck(array, left, j-);
  45. } else {
  46. /**
  47. * 如果left比right小,说明左子树中有元素比根节点大,或者右子树中有元素比根节点小
  48. * */
  49. return false;
  50. }
  51. }

出题:输入一个英文句子,其中的单词以空格符号隔开;要求翻转句子中单词的顺序,但是单词内字符顺序不变(简单起见,标点符号和普通字母一样处理);

分析:两次翻转,全局翻转(针对所有字符)和局部翻转(针对两个空格符之间的字符)

解题:

  1. /**
  2. * 借用之前已经实现的全局翻转函数reverse
  3. * */
  4. void reverse(char* target, int length) {
  5. char temp;
  6. int i;
  7. for(i=;i<length/;i++) {
  8. temp=*(target+i);
  9. *(target+i)=*(target+(length-i-));
  10. *(target+(length-i-))=temp;
  11. }
  12. }
  13. void DoubleTransfer(char *target, int length) {
  14. /**
  15. * 首先进行全局翻转,得到!tneduts a ma i
  16. * */
  17. reverse(target, length);
  18. char *part=NULL;
  19. int partLength;
  20. /**
  21. * 然后进行局部翻转,从第一个非空格符的字符开始计算
  22. * 子子序列的长度,直到第一个空格符号结束,然后
  23. * 调用reverse进行局部翻转,最后进入下一个iteration
  24. * */
  25. for(int i=;i<length;i++) {
  26. partLength=;
  27. while(target[i] == ' ' && i<length) i++;
  28. part=target+i;
  29. while(target[i] != ' ' && i<length) {
  30. i++;
  31. partLength++;
  32. }
  33. reverse(part, partLength);
  34. }
  35. }

笔试算法题(07):还原后序遍历数组 & 半翻转英文句段的更多相关文章

  1. 笔试算法题(40):后缀数组 & 后缀树(Suffix Array & Suffix Tree)

    议题:后缀数组(Suffix Array) 分析: 后缀树和后缀数组都是处理字符串的有效工具,前者较为常见,但后者更容易编程实现,空间耗用更少:后缀数组可用于解决最长公共子串问题,多模式匹配问题,最长 ...

  2. LintCode2016年8月8日算法比赛----中序遍历和后序遍历构造二叉树

    中序遍历和后序遍历构造二叉树 题目描述 根据中序遍历和后序遍历构造二叉树 注意事项 你可以假设树中不存在相同数值的节点 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下 ...

  3. [剑指offer] 二叉搜索树的后序遍历序列 (由1个后续遍历的数组判断它是不是BST)

    ①题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. ②思路 1.后续遍历的数组里,最后一个元素是根. 2 ...

  4. 【Java】 剑指offer(33) 二叉搜索树的后序遍历序列

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如 ...

  5. leetcode 105 106 从前序与中序遍历序列构造二叉树 从中序与后序遍历序列构造二叉树

    题目: 105 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  6. [LeetCode] 889. Construct Binary Tree from Preorder and Postorder Traversal 由先序和后序遍历建立二叉树

    Return any binary tree that matches the given preorder and postorder traversals. Values in the trave ...

  7. (原)neuq oj 1022给定二叉树的前序遍历和后序遍历确定二叉树的个数

    题目描述 众所周知,遍历一棵二叉树就是按某条搜索路径巡访其中每个结点,使得每个结点均被访问一次,而且仅被访问一次.最常使用的有三种遍历的方式: 1.前序遍历:若二叉树为空,则空操作:否则先访问根结点, ...

  8. LeetCode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)

    题目描述 根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9 ...

  9. 51nod 1832 前序后序遍历

    思路:设只有一颗子树的节点有ans个设前序边历数组为pre[100],后序遍历数组为pos[100]:前序遍历的第二个元素是A的一个子节点左右节点不知,设ax-ay表示一个树的前序遍历,bx-by表示 ...

随机推荐

  1. asp.net mvc 多字段排序

    以下代码可实现多字段排序,通过点击列标题,实现排序. 控制器: public ActionResult Index(string sortOrder) { ViewBag.FirstNameSortP ...

  2. (转)Silverlight_5_Toolkit_December_2011 安装后点击Toolkit Samples没反应的解决方法

    Silverlight Toolkit官方下载地址: http://silverlight.codeplex.com/ http://blog.csdn.net/hcj116/article/deta ...

  3. MYSQL自动备份策略的选择(转载)

    原文地址: http://shinepaopao.iteye.com/blog/1938568

  4. Python2.7 Queue模块学习

    前面了解了一下threading,发现一般都是和queue模块配合使用的,queue产生一个队列,队列模式有3种,针对这三种队列分别有三个构造函数: 1 FIFO队列先进先出:class Queue. ...

  5. idea设置控制台不打印日志

    这样做的好处是当想打印数据到控制台查看就特别方便,这个在大数据spark sql使用的多.当然如果代码报错也会打印,这个不必担心. 方案Ⅰ 方法是将这个log日志文件放到idea的资源目录里即可 lo ...

  6. bzoj 1040: [ZJOI2008]骑士【基环树+树形dp】

    没考虑可以连着两个不选--直接染色了 实际上是基环森林,对于每棵基环树,dfs找出一个环边,然后断掉这条边,分别对这条边的两端点做一边treedp,取max加进答案里 treedp是设f[u]为选u点 ...

  7. 2015湘潭市第七届大学生程序设计竞赛 —— Fraction

    题目大意: 小数化分数,但是分母限制在[1,1000],很明显的枚举,但是在赛场上的时候傻逼了,无论怎么枚举,怎么二分就是wa,wa到死···········. (ps:我要给出题人寄刀片~~~~), ...

  8. New Year Tree CodeForces -620E

    这个题有一个技巧:把颜色压到一个long long 上. #include<cstdio> #include<algorithm> #include<cstring> ...

  9. 暴力(判凸四边形) FZOJ 2148 Moon Game

    题目传送门 题意:给了n个点的坐标,问能有几个凸四边形 分析:数据规模小,直接暴力枚举,每次四个点判断是否会是凹四边形,条件是有一个点在另外三个点的内部,那么问题转换成判断一个点d是否在三角形abc内 ...

  10. Service官方教程(9)绑定服务时的注意事项

    Binding to a Service Application components (clients) can bind to a service by calling bindService() ...