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

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

解题:

  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 mvc4 controller

    controller返回几种返回结果

  2. strcpy(转载)

    转自:http://www.kuqin.com/clib/string/strcpy.html 原型:extern char *strcpy(char *dest,char *src); 用法:#in ...

  3. bzoj 2152: 聪聪可可【点分治】

    裸的点分治,运算在模3下进行然后统计答案的时候统计余1的*余2的*2+余0的^2 #include<iostream> #include<cstdio> using names ...

  4. bzoj 4819: [Sdoi2017]新生舞会【二分+最小费用最大流】

    如果\( b[i]==0 \)那么就是裸的费用流/KM,当然KM快一些但是为什么不写KM呢因为我不会打板子了 考虑二分答案,那么问题变成了判定问题. \[ ans=\frac {a_1+a_2+... ...

  5. git上拉取tag,识别最新tag在此版本上新增tag

    通过shell 脚本自动获取最新tag,并输入最新版本后,推到git上 # 拉取分支上现有的tags git fetch --tags echo -e "所有tag列表" git ...

  6. javascript---DOM大编程2

    编程挑战 现在利用之前我们学过的JavaScript知识,实现选项卡切换的效果. 效果图: 文字素材: 房产: 275万购昌平邻铁三居 总价20万买一居    200万内购五环三居 140万安家东三环 ...

  7. [Usaco2005 Feb]Feed Accounting 饲料计算

    Description Farmer John is trying to figure out when his last shipment of feed arrived. Starting wit ...

  8. Zoj 1610 Count the Colors (线段树+区间更新+暴力计数)

    题目大意: 有n次操作,每次都是对一根线中的一段区间进行染色(颜色并不相同),有时候后面的颜色有可能覆盖前面的颜色,问最后涂完色,能看到的颜色有几种,每种颜色有几部分? 解题思路: 这个题目建树的时候 ...

  9. [转]C# 邮箱验证激活

    原文链接 /// <summary> /// 发送邮件 发送激活码 /// </summary> /// <param name="address"& ...

  10. 定时清除 /var/log/massage 下的信息脚本文件

    定时清除 /var/log/massage 下的信息脚本 #!/bin/sh #Date: 0:07 #Author: Xiaodong #Mail: 990974238@qq.com #Puncti ...