zoukankan      html  css  js  c++  java
  • 剑客练习

    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就不会错误
  • 相关阅读:
    poj 3667 Hotel
    codevs 1380 没有上司的舞会
    bzoj 4033 树上染色
    bzoj 1179 [APIO 2009]Atm(APIO水题)
    poj 1741 Tree
    bzoj 3600 没有人的算术
    poj 3233 Matrix Power Series
    hdu 2256 Problem of Precision -矩阵快速幂
    [矩阵十题第七题]vijos 1067 Warcraft III 守望者的烦恼 -矩阵快速幂
    main函数递归
  • 原文地址:https://www.cnblogs.com/asasas/p/9590073.html
Copyright © 2011-2022 走看看