剑客练习

1,在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数

输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

一维数组和二维数组类似矩阵  从a[i][j]开始比较

function Find(target, array) {
  let i = 0;
  let j = array[i].length - 1;
  while (i < array.length && j >= 0) {
    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)
{
    return str.replace(/\s/g,'%20')
}

  str.repalce(/\s/g)是替换空格的意思

除了空格  可以后面填写替换别的东西  比如汉字  "我","你"

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

function printListFromTailToHead(head)
{
    if(!head){
        return 0;
    }
    else{
        var arr=new Array();
        for(var q=head;q;q=q.next){
            arr.push(q.val);
        }
    }
    arr.reverse();
    return arr;
}

  第一种先判断头是否为空,不为空时用q指针 arr数组push结尾添加值。最后把数组翻转

第二种

function printListFromTailToHead(head)
{
    var p=head;
    var result=[];
    while(p){
        result.unshift(p.val)
        p=p.next;
    }
    return result;
}

  用unshift进行头部添加 直接实现

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

function reConstructBinaryTree(pre, vin)
{
    // write code here
    if(pre.length==0||vin.length==0){
        return null;
    };
    let index=vin.indexOf(pre[0]),
        left=vin.slice(0,index),
        right=vin.slice(index+1);
    return {
        val:pre[0],
        //递归左右子树的前序、中序
        left:reConstructBinaryTree(pre.slice(1,index+1),left),
        right:reConstructBinaryTree(pre.slice(index+1),right)
    };
}

  

本题主要考察了二叉树的遍历,先复习下

前序遍历(VLR): 
    1.访问根节点 
    2.前序遍历左子树 
    3.前序遍历右子树 
中序遍历(LVR): 
    1.中序遍历左子树 
    2.访问根节点 
    3.中序遍历右子树 
后序遍历(LRV): 
    1.后序遍历左子树 
    2.后序遍历右子树 
    3.访问根节点

总之,做这种有关树、链表的题一定要有递归的思想,总之该题的解题思路就是四步,具体思路可以参考这里

1 确定根,确定左子树,确定右子树。

2 在左子树中递归。

3 在右子树中递归。

4 打印当前根。

 

 

采用二分法解答这个问题,
mid = low + (high - low)/2
需要考虑三种情况:
(1)array[mid] > array[high]:
出现这种情况的array类似[3,4,5,6,0,1,2],此时最小数字一定在mid的右边。
low = mid + 1
(2)array[mid] == array[high]:
出现这种情况的array类似 [1,0,1,1,1] 或者[1,1,1,0,1],此时最小数字不好判断在mid左边
还是右边,这时只好一个一个试 ,
high = high - 1
(3)array[mid] < array[high]:
出现这种情况的array类似[2,2,3,4,5,6,6],此时最小数字一定就是array[mid]或者在mid的左
边。因为右边必然都是递增的。
high = mid
注意这里有个坑:如果待查询的范围最后只剩两个数,那么mid 一定会指向下标靠前的数字
比如 array = [4,6]
array[low] = 4 ;array[mid] = 4 ; array[high] = 6 ;
如果high = mid - 1,就会产生错误, 因此high = mid
但情形(1)中low = mid + 1就不会错误

 

posted @ 2018-09-05 09:00  asss1  阅读(89)  评论(0编辑  收藏  举报