输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
来源:互联网 发布:手机天猫 手机淘宝 编辑:程序博客网 时间:2024/05/01 04:28
package Test;public class Solution {public static void main(String[] args) {int pushA[]={1,2,3,4,5};int popA[]={4,3,5,1,2};System.out.println(IsPopOrder(pushA,popA));}/****************************************************************************** * 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。 * 假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列, * 但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) * 注意:数组的长度相同,数组中不会出现重复的数字,但是可能长度为1,并且入栈数组并不一定是1,2,3,4这样从小到大的序列 * 有可能是2,1,3,5,4之类的数字。 * 关键:记录出栈数组元素对应在入栈数组中索引顺序,入栈数组元素的索引代表着那个元素先入栈,入栈顺序会对出栈元素的顺序有限制 * 1.后面元素的索引大于前面的索引肯定成立 * 2.后面元素的索引等于(=)前面的索引-1肯定成立 * 3.后面元素的索引<前面的索引-1 会有不成立的可能 * 假如该元素的的索引为data[j],j表示出栈数组的下标,取max=max{data[0],data[1]...data[j-1]} * 则当第j个元素的索引==0到max-1中除去data[0],data[1]...data[j]的最大的一个元素时,该序列还是满足条件的,继续查找j++; * 否则return false; * @param pushA 入栈顺序数组 * @param popA 出栈顺序数组 * @return ******************************************************************************/public static boolean IsPopOrder(int [] pushA,int [] popA) {if(pushA.length!=1){int data[]=new int[pushA.length];for(int i=0;i<pushA.length;i++){data[i]=findIndex(pushA,popA[i]);//以入栈顺序为基准,存储出栈元素对应的索引}int j=1;int max=-1;while(j<pushA.length-1){if(data[j]>data[j-1])//后面大于前面肯定成立{}else if(data[j]==data[j-1]-1){}else //后面小于前面,则该元素必须为在0--max{data[0]...data[j-1]}中除去 data[0]--data[j-1],{for(int i=0;i<j;i++)//{max=Math.max(max,data[i]);//则该元素必须为在0--max{data[0]...data[j-1]}}for(int i=max-1;i>=0;i--){int count=0;for(int p=0;p<j;p++){if(i==data[p]){count++;}}if(count==0)//一旦都不相同,表明下一个位该是当前的i值了{if(data[j]==i)//说明位置j是成立的break;elsereturn false;}}}j++;}return true;}else{return pushA[0]==popA[0]?true:false;} } public static int findIndex(int[] pushA,int value) { int start=0; int end=pushA.length-1; int mid=0; while(start<=end) { mid=(start+end)/2; if(pushA[mid]>value) end=mid-1; else if(value>pushA[mid]) start=mid+1; else return mid; } return -1;}}
阅读全文
0 0
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
- 剑指offer题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列12345是某栈的压入顺序,序列45321为该压栈序列对应弹出顺序。
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一
- 判断第二个序列是否为第一个序列的弹出顺序
- 判断一个序列是否是该栈的弹出顺序
- 输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序
- 题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。
- 【算法】输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。
- 输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序
- 输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。
- 微软算法100道题-------输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。
- Java 配置环境变量
- 三招两式,轻松搞定Excel文本算式
- 汇付科技新员工IT环境须知
- 【上海校区】海哥解惑-常见中文乱码问题解决方式
- java数据结构与算法-有序链表
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。
- 机器学习笔记:线性回归
- UE4中常用的几个事件类
- Android Service
- Unity3d四 android 添加unity3d view
- Java基础知识汇总
- jQuery学习笔记——DOM练习(1)
- html5制作旋转div2
- Scikit-learn实现基于模型的推荐系统(SVD)