笔试算法题(07):还原后序遍历数组 & 半翻转英文句段
出题:输入一个整数数组,判断该数组是否符合一个二元查找树的后序遍历(给定整数数组,判定其是否满足某二元查找树的后序遍历);
分析:利用后序遍历对应到二元查找树的性质(序列最后一个元素必定是根节点,从左向右第一个比根节点大的元素开始直到根节点之前的所有元素必定在右子树,之前的所有元素必定在左子树);
解题:
bool PostOrderCheck(int *array, int i, int j) {
/**
* 如快速排序一样,解决小子文件
* */
if(j-i+ == ) {
if(array[i]<=array[i+] && array[i+]<=array[i+])
return true;
else
return false;
} else if(i-i+ == ) {
if(array[i]<=array[i+] || array[i]>=array[i+])
return true;
else
return false;
} int left=i, right=j-;
/**
* 一共有四种情况:指针交叉后跳出,指针未交叉即跳出,left到达最右边,right到达最左边
* 如果第二种情况成立则判定必定失败
* */
while(left<j) {
if(array[left]>array[j])
break;
left++;
}
while(right>=i) {
if(array[right]<array[j])
break;
right--;
}
/**
* 两种特殊情况:只有左子树或者只有右子树的递归
* */
if(left==j || right<i)
return PostOrderCheck(array, i, j-);
/**
* 另外两种跳出情况,break,此时left和right不可能重合
* */
if(left>right) {
/**
* 如果left比right大,说明成功交叉
* */
return PostOrderCheck(array, i, right) || PostOrderCheck(array, left, j-);
} else {
/**
* 如果left比right小,说明左子树中有元素比根节点大,或者右子树中有元素比根节点小
* */
return false;
}
}
出题:输入一个英文句子,其中的单词以空格符号隔开;要求翻转句子中单词的顺序,但是单词内字符顺序不变(简单起见,标点符号和普通字母一样处理);
分析:两次翻转,全局翻转(针对所有字符)和局部翻转(针对两个空格符之间的字符)
解题:
/**
* 借用之前已经实现的全局翻转函数reverse
* */
void reverse(char* target, int length) {
char temp;
int i;
for(i=;i<length/;i++) {
temp=*(target+i);
*(target+i)=*(target+(length-i-));
*(target+(length-i-))=temp;
}
}
void DoubleTransfer(char *target, int length) {
/**
* 首先进行全局翻转,得到!tneduts a ma i
* */
reverse(target, length);
char *part=NULL;
int partLength;
/**
* 然后进行局部翻转,从第一个非空格符的字符开始计算
* 子子序列的长度,直到第一个空格符号结束,然后
* 调用reverse进行局部翻转,最后进入下一个iteration
* */
for(int i=;i<length;i++) {
partLength=;
while(target[i] == ' ' && i<length) i++;
part=target+i;
while(target[i] != ' ' && i<length) {
i++;
partLength++;
}
reverse(part, partLength);
}
}
笔试算法题(07):还原后序遍历数组 & 半翻转英文句段的更多相关文章
- 笔试算法题(40):后缀数组 & 后缀树(Suffix Array & Suffix Tree)
议题:后缀数组(Suffix Array) 分析: 后缀树和后缀数组都是处理字符串的有效工具,前者较为常见,但后者更容易编程实现,空间耗用更少:后缀数组可用于解决最长公共子串问题,多模式匹配问题,最长 ...
- LintCode2016年8月8日算法比赛----中序遍历和后序遍历构造二叉树
中序遍历和后序遍历构造二叉树 题目描述 根据中序遍历和后序遍历构造二叉树 注意事项 你可以假设树中不存在相同数值的节点 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下 ...
- [剑指offer] 二叉搜索树的后序遍历序列 (由1个后续遍历的数组判断它是不是BST)
①题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. ②思路 1.后续遍历的数组里,最后一个元素是根. 2 ...
- 【Java】 剑指offer(33) 二叉搜索树的后序遍历序列
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如 ...
- leetcode 105 106 从前序与中序遍历序列构造二叉树 从中序与后序遍历序列构造二叉树
题目: 105 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...
- [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 ...
- (原)neuq oj 1022给定二叉树的前序遍历和后序遍历确定二叉树的个数
题目描述 众所周知,遍历一棵二叉树就是按某条搜索路径巡访其中每个结点,使得每个结点均被访问一次,而且仅被访问一次.最常使用的有三种遍历的方式: 1.前序遍历:若二叉树为空,则空操作:否则先访问根结点, ...
- LeetCode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)
题目描述 根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9 ...
- 51nod 1832 前序后序遍历
思路:设只有一颗子树的节点有ans个设前序边历数组为pre[100],后序遍历数组为pos[100]:前序遍历的第二个元素是A的一个子节点左右节点不知,设ax-ay表示一个树的前序遍历,bx-by表示 ...
随机推荐
- Pow(x, n) 位运算总结 典型
https://leetcode.com/problems/powx-n/ Implement pow(x, n), which calculates x raised to the power n ...
- RestTemplate中headers中添加Host不生效
在使用restTemplate访问内网接口时,不打算指host,支持ip访问,所以我们需要再header中指定host.但经调试,发现HttpURLConnection中Host无法覆盖.解决方案: ...
- Uix Kit 快速建站前端开发套件-工具箱
这个产品维护已经有一年了(由于业务需求不同,目前没有做中文版,产品本身是针对国外网站),自己本身是做UI出生,开发只是业余爱好,仅仅作为平时工作的需要.杂七杂八会一些前后端开发.并非职业码农! 我是一 ...
- Java中关键字continue、break和return的区别
Java中关键字continue.break和return的区别: continue:跳出本次循环继续下一次循环 break: 跳出循环体,继续执行循环外的函数体 return: 跳出整个函数 ...
- ACboy needs your help HDU - 1712
ACboy needs your help HDU - 1712 ans[i][j]表示前i门课共花j时间最大收益.对于第i门课,可以花k(0<=k<=j)时间,那么之前i-1门课共花j- ...
- swing中的线程
1. 初始化线程 初始化线程用于创建各种容器,组件并显示他们,一旦创建并显示,初始化线程的任务就结束了. 2. 事件调度线程(单线程:只有一个线程在负责事件的响应工作.) 通过事件监听的学习,我们了解 ...
- synchronized(5)修饰语句块之:synchronized(XXX.class)
synchronized(XXX.class)有两种写法 synchronized(XXX.class)或者synchronized(obj.getClass()) Class也是一个类xxx.cla ...
- JAVA中abstract,interface,final,static语法
转自:http://www.cnblogs.com/yueue/archive/2010/04/20/1715863.html 一,抽象类:abstract 1,只要有一个或一个以上抽象方法的 ...
- Android上的线程安全
Thread-safe methods In some situations, the methods you implement might be called from more than one ...
- 怎么将ts文件快速合成一个文件
ts文件的排序要有一定的规则,最简单的就是:1.ts.2.ts.3.ts等. 使用Win + R打开下面窗口. 输入“cmd”,点击“确定”,打开下面窗口. 输入命令行:“copy /b ...