19、剑指offer–顺时针打印矩阵
题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
思路:
选坐标为(0,0),(1,1)…的点记为(start,start),作为开始坐标,下一圈开始坐标为(start+1,start+1);判断是否进入下一圈(即是否打印完成)的条件是rows>start*2 && cols>start*2;打印一圈的左上角坐标为(start,start),右下角的坐标为(cols-start-1,rows-start-1);根据一圈左上角和右下角坐标判断“从左到右”,“从上到下”,“从右到左”,“从下到上”需要打印的点。
代码:
function printMatrix(matrix)
{
// write code here
if(matrix == null || matrix.length == 0) return null;
var start = 0;
var result = [];
var clos = matrix[0].length;
var rows = matrix.length;
while(clos > start * 2 && rows > start * 2){
var endX = clos - start - 1;
var endY = rows - start - 1;
//从左到右
for(var i = start ; i <= endX ; i++){
result.push(matrix[start][i]);
}
//从上到下
if(start < endY){
for(var i = start + 1 ; i <= endY ; i++){
result.push(matrix[i][endX]);
}
}
//从右到左
if(start < endX && start < endY){ // 注意必须加两个条件,防止出现X与Y不相等的情况
for(var i = endX - 1 ; i >= start ; i--){
result.push(matrix[endY][i]);
}
}
//从下到上
if(start < endY && start < endX){ // 注意必须加两个条件,防止出现X与Y不相等的情况
for(var i = endY - 1 ; i >= start + 1 ; i--){
result.push(matrix[i][start]);
}
}
start ++;
}
return result;
}
20、剑指offer–包含min函数的栈
题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
思路:
数组的栈方法。
代码:
var result = [];
function push(node)
{
return result.push(node);
}
function pop()
{
return result.pop();
}
function top()
{
return result.length > 0 ? result[result.length -1] : null;
}
function min()
{
if( result.length == 0 || result == null ) return;
var min = result[0];
result.forEach(function(item){
if(item < min){
min = item;
}
});
return min;
}
21、剑指offer–栈的压入、弹出序列
题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
思路:
设置辅助栈,压入元素,判断栈顶元素是否等于出栈第一个,相同则出栈,不同则继续入栈
代码:
function IsPopOrder(pushV, popV)
{
var tem = [];
for(var i = 0 , j = 0 ; i < pushV.length ; i++){
tem.push(pushV[i]);
while(tem.length && tem[tem.length - 1] == popV[j]){
tem.pop();
j++;
}
}
return tem.length == 0;
}
22、剑指offer–从上往下打印二叉树
题目描述:
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
思路:
采用队列方法,先将根节点放入队列中,然后打印,接着将左右节点加入队列中。
代码:
function PrintFromTopToBottom(root)
{
var result = [];
if(root == null) return result;
var queue = [];
queue.push(root);
while(queue.length){
var tem = queue.shift();
result.push(tem.val);
if(tem.left){
queue.push(tem.left);
}
if(tem.right){
queue.push(tem.right);
}
}
return result;
}
23、剑指offer–二叉搜索树的后序遍历序列
题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
后序遍历最后一个元素为根节点,所以先遍历,将数组分为小于根节点部分和大于根节点部分,然后比较这两个部分是否符合与根节点的大小关系。
代码:
function VerifySquenceOfBST(sequence)
{
if(sequence.length <= 0) return;
return test(sequence,0,sequence.length - 1);
}
function test(sequence,start,end){
if(start >= end) return true;
var i = end - 1;
while(i >= start && sequence[i] > sequence[end]){
i--;
}
for(var j = i ; j >= start ; j--){
if(sequence[j] > sequence[end]){
return false;
}
}
return test(sequence,start,i)&&test(sequence,i+1,end-1) ;
}
24、剑指offer–二叉树中和为某一值的路径
题目描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路:
判断当前结点是否是叶子结点,以及curtSum是否等于expectNumber。如果是,把当前路径保存在res结果中;
代码:
function FindPath(root, expectNumber)
{
var result = [];
if(root == null) return result;
test(root,0,[]);
function test(root,current,path){
current += root.val;
path.push(root.val);
if(current == expectNumber && root.left == null && root.right == null){
result.push(path.slice(0));
}
if(root.left != null){
test(root.left,current,path)
}
if(root.right != null){
test(root.right,current,path)
}
path.pop();
}
return result;
}
剑指Offer每日6题(JavaScript版)-系列文章参考专栏:JavaScript版剑指offer