11天刷剑指offer——JavaScript版——第一天

1、二维数组中的查找

题目描述

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

思路

因为矩阵的特殊性,先从第一列最后一行开始比较,小于则向上查找,大于则向后查找

代码

function Find(target, array)
{
    var row = array.length-1;
//row是行数 j是列数
    for(var i=row,j=0; i>=0 && j<array[i].length;){
        if(target == array[i][j]){
            return true;
        }else if(target > array[i][j]){
            j++;
            continue;
        }else if(target < array[i][j]){
            i--;
            continue;
        }
    }
    return false;
}

2、替换空格

题目描述

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

思路

使用正则表达式,\s+代表多个空格,?则表示取尽可能少的空格,然后通过replace函数替换为%20

代码

function replaceSpace(str)
{
    // write code here
    return str.replace(/\s+?/g,'%20')
}

//或者用空格来分离字符串,再填入需要的
function replaceSpace(str)
{
    var array = str.split(' ');
    var newStr = array.join('%20');
    return newStr;
}

3、从尾到头打印链表

题目描述

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

思路

先将链表每个结点的值存入数组中,然后通过数组的reverse方法,即可从尾到头打印

代码

/*function ListNode(x){
    this.val = x;
    this.next = null;
}*/
function printListFromTailToHead(head)
{
    // write code here
    var arr=[];
    while(head!=null){
        arr.push(head.val);
        head=head.next;
    }
    return arr.reverse()
}

//另一种写法
//unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度,unshift() 方法不创建新的创建,而是直接修改原有的数组
function printListFromTailToHead(head)
{
    var array = [];
    while(head){
      //放到数组的开头 循环下去第一个就是尾巴
        array.unshift(head.val);
        head = head.next;
    }
    return array;
}

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)
{
    // write code here
    //递归出口
    if(pre.length==0 || vin.length==0) return null;
    //前序遍历先遍历根节点,所以先找到中序遍历中根节点的位置
    //indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
    var index=vin.indexOf(pre[0]);
    //slice(start,end)返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
    var left=vin.slice(0,index);//中序左子树
    var right=vin.slice(index+1);//中序右子树
    return {
        val:pre[0],//根节点
        //递归左右子树的前序,中序
        left:reConstructBinaryTree(pre.slice(1,index+1),left),
        right:reConstructBinaryTree(pre.slice(index+1),right)
     };
}

5、用两个栈实现队列

题目描述

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

思路

队列是先进先出的结构,栈是先进后出的结构,所以可以直接使用JavaScript的数组类型来实现。

代码

var result=[];
function push(node)
{
    // write code here
    result.push(node)

}
function pop()
{
    // write code here
    return result.shift()
}

6、旋转数组的最小数字——二分查找的变形——搞不懂

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

思路一

直接将数组按从小到大排序,返回第一个元素即可。

代码

function minNumberInRotateArray(rotateArray)
{
    // write code here
    rotateArray.sort(function(a,b){
        if(a<b) return -1;
        else return 1;
    });
    return rotateArray[0];
}

思路二

采用二分法解答这个问题,三种情况

  1. 数组为空
  2. 部分旋转,例如由(1,2,3,4,5)旋转为(3,4,5,1,2),此时只需要遍历数组,找到当前数比前面的数小的数即可。
  3. 完全旋转,例如由(1,2,3,4,5)旋转为(1,2,3,4,5),此时第一个数最小

代码

function minNumberInRotateArray(rotateArray)
{
      //数组为空返回0
  if(rotateArray.length===0){
        return 0;
    }
    //数组长度为1返回第一个
    if(rotateArray.length===1){
        return rotateArray[0];
    }
    //parseInt(string, radix)可解析一个字符串,并返回一个整数。
    /* string	必需。要被解析的字符串。
    radix	可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。  */

    var index=parseInt(Math.floor((rotateArray.length)/2)); //二分
    var left=rotateArray.slice(0,index); //左
    var right=rotateArray.slice(index);  //右
    var recuArray;//rotateArray[index-]>=rotateArray[0]?right:left;//判断左右
    if(rotateArray[index-1]<rotateArray[0]){
        recuArray=left;
    }else {
        //是否还是旋转数组
        if(right[0]<=right[right.length-1]) return right[0];
        else recuArray=right;
    }
    return minNumberInRotateArray(recuArray); //递归
}

猜你喜欢

转载自blog.csdn.net/jiuchabi7492/article/details/88225691