牛客剑指offer习题解答

题1 二维数组中的查找

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

// 运行时间:115ms
// 占用内存:7772k
function Find(target, array)
{
    // write code here
    let l1 = array.length
    let l2 = array[0].length
    let i = l1-1
    let j = 0
// js中换作while循环就无法通过了,是否说明js中for循环性能优于while循环?
// 后面用while重写通过,问题出在判断语句······(控制边界与控制结果)
    for(;i >= 0 && j <= (l2-1);){
        if(array[i][j] > target){
            i--
        }else if(array[i][j] < target){
            j++
        }else{
            return true
        }
    }
    return false
}

题2 替换空格

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

function replaceSpace(str)
{
    // 对js来说这道题很简单,使用正则表达式就可以做了
    // /\s/是空格,后面加个g,替换全局的空格
    return str.replace(/\s/g,"%20")
}

题3 从未到头打印链表

输入一个链表,从尾到头打印链表每个节点的值。

/*function ListNode(x){
    this.val = x;
    this.next = null;
}*/
function printListFromTailToHead(head)
{
  var res = [], pNode = head;
  // javascript数组操作,unshift插入数组第一位    
  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)
{    
    // 空值要注意
    if(pre.length === 0){
        return null
    }
    let left_pre,left_vin,right_pre,right_vin = []
    let head = new TreeNode(pre[0])
    let root = vin.indexOf(pre[0])
    left_pre = pre.slice(1, root+1)
    right_pre = pre.slice(root+1)
    left_vin = vin.slice(0,root)
    right_vin = vin.slice(root+1)
    // 递归:将根下面分为左右子树;然后求得左右子树的根节点
    head.left = reConstructBinaryTree(left_pre, left_vin)
    head.right = reConstructBinaryTree(right_pre, right_vin)
    return head
}

你可能感兴趣的:(牛客剑指offer习题解答)