剑指offer刷题 JavaScript版 代码及思路分析(一)

1.在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

var array = [
    [1, 2, 3, 4, 5],
    [2, 3, 4, 5, 6],
    [3, 4, 5, 6, 7],
    [4, 5, 6, 7, 8],
    [5, 6, 7, 8, 9]
]
function Find(array,num){
	for (var i = 0;i<array.length;i++){
		for(var j = 0;j<array[0].length;j++)
		if(array[i][j] == num){
			return true
		}
	}
	return false
}

2.请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

function Replace(string){
	var result = string.replace(/\s/g,,'%20')
	return result
}

3.输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

/*function ListNode(x){
 this.val = x;
 this.next = null;
 }*/
function printListFromTailToHead(head) {
  const res = [];
  let pNode = head;// 把指针指向头部,从头往后的顺序
  while (pNode !== null) {
    res.unshift(pNode.val);
    pNode = pNode.next;
  }
  return res;
}

4. 重建二叉树----输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function reConstructBinaryTree(pre, vin)
// pre前序遍历的序列
//vin中序遍历的序列
{
    // write code here
    if(pre.length==0|| vin.length==0)
        return null
    // 前序第一个是根节点,也是中序左右子树的分割点
    // 前序遍历 根左右,中序遍历 左根右,后序遍历 左右根
    var index = vin.indexOf(pre[0]) //根结点在中序遍历中的索引
    var left = vin.slice(0,index);//左侧的数据
    var right=vin.slice(index+1,pre.length);//右侧的数据
    return {
        val:pre[0], //根节点
		// 递归左右子树的前序、中序
        left:reConstructBinaryTree(pre.slice(1,index+1),left),
        right:reConstructBinaryTree(pre.slice(index+1),right)
    }
}

5.用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

const inStack = []
const outStack = []
//1234
//inStack入栈【1234】出队【4321】
//outStack入队【1234】出队【1234】
//outStack出栈相当于1234出队-->1234
//用栈模拟队列,那么出队列相当于用入栈一个一个出栈,将该值放入出栈的序列
function push(node) {
    inStack.push(node)
}
function pop() {
    if(!outStack.length){ //如果outStack队列里面有值
        while(inStack.length){
            outStack.push(inStack.pop())
            //push pop返回增加删除的那一项值
        }
    }
    return outStack.pop()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值