剑指offer の 1-10 之javascript实现

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

思想:根据二维数组的结构,从左到右递增,从上到下递归,选择一个比较适合的切入点,进行数组遍历,比较。这个选择的切入点需要满足,当要查找的数据与它作比较时,有唯一的出路可走,如当要查找的数据大于这个切入点时,下面该往哪里继续查找,不能同时几条路都可以选择,那判断起来就麻烦了。这里我们以第n行第1列数据为切入点,即二维数组最左下角的元素,这样当要查找的数据大于该切入点时,直接j++向右进行遍历,如果要查找的数据小于该切入点时,直接i--向上进行遍历,否则,那切入点即为要查找的数据,如此循环,直到找到为止。

function Find(target, array)  
{
    var row=array.length;
    if(row==0){
        return false;
   }
    var col=array[0].length;
    var i=row-1,j=0;  //以最后一行第一列为基准
    while(i>=0&&j<col){ //循环
        if(array[i][j]<target){ //待查找值大,继续向右查找
            j++;
        }else if(array[i][j]>target){ //待查找值小,向上继续查找
            i--;
        }else{   //找到
            return true;
        }
    }

 

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

function replaceSpace(str)  
{
    var newstr;
    newstr=str.replace(/\s/g,"%20"); //正则表达式匹配,替换
    return newstr;
}
或
function replaceSpace(str)   
{
    if(str.length==0){
        return str;
    }
    var len=str.length; //将输入字符串长度存储起来
    var str1=""; //定义一个新的空字符串
    for(var i=0;i<len;i++){ 
        if(str[i]==' '){  //如果读取到str的空格处,用“%20”赋值到str1
            str1+="%20";
        }else{
            str1+=str[i];//如果读取到str的非空格处,将str该处的字符赋值给str1
        }
    }
    return str1;  //返回str1
}

 

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

思想:新创建一个数组,将链表中的数据依次push进数组,然后将数组反转,并输出反转后的数组。

function printListFromTailToHead(head)   
{
    var lst=[]; //定义一个数组
    while(head!=null){  //将链表中的元素push进数组
        lst.push(head.val); //将链表的头指针指向的元素push进数组
        head=head.next;  //指针指向后移
    }
    lst.reverse();  //利用reverse()方法将数组颠倒顺序
    return lst;  //返回颠倒后的数组
}

 

 

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

思想:将数据push进栈1,将栈1中的数据pop进栈2,将栈2中的数据pop出去。当栈2为空时,再将栈1中的数据pop进栈2,即将栈2中的数据一次性pop完。

 

function Stack(){       //定义栈及栈中方法

    this.dataStore =[]

    this.top =0

    this.psh=psh

    this.empty=empty

    this.pp=pp

}

function empty(){        

    return this.top<=0

}

function psh(element){

    this.dataStore[this.top++] = element

}

function pp(){

    if(this.empty()){

        return 0;

    }

    return this.dataStore[--this.top]

}

var stack1 = new Stack()    

var stack2 = new Stack()

function push(node){     //将节点push进栈1中

    stack1.psh(node)

}

function pop()

{

    if(stack2.empty()){        //判断栈2是否为空,当栈2为空时,再将栈1里的数据push进栈2,每次将栈2中的数据全部pop出去

        while(!stack1.empty()){

            stack2.psh(stack1.pp())

        }

    }

    return stack2.pp()               //返回栈2pop出去的数据

 
}

 

 

 

 

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

思想:元素查找,遍历

function minNumberInRotateArray(rotateArray)  
{
    var len=rotateArray.length;
    if(len==0){
        return 0;
    }else if( len==1){
       return rotateArray[0];
    }
    for(var i=len-1;i>=1;i--){
        if(rotateArray[i]<rotateArray[i-1]){
            return rotateArray[i];
        }
    }
    return rotateArray[0];
}

 

7--大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39

思想:递归

function Fibonacci(n)  
{
    if(n==0){
        return 0;
    }
    var fn=[1,1];  //最开始的两个数
    for(var i=2;i<n;i++){
        fn[i]=fn[i-1]+fn[i-2] //后一个数为前两个数之和,递归
    }
    return fn[n-1];  //返回数组的第n个数
}

 

8--一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思想:给出n,第一次有两种情况,跳2那么剩下f(n-2)种跳法,跳1剩下f(n-1)种跳法,总的是f(n-1)+f(n-2)可以往下一直递归。

jumpFloor(number)  
{ function
    if(number<=0){
        return 0;
    }
    var jump=[1,2];
    for(var i=2;i<number;i++){
        jump[i]=jump[i-1]+jump[i-2];
    }
    return jump[number-1];
}

 

9--一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思想:

f(1)=1,f(2)=2,f(3)=1+f(2)+f(1)...

f(3)可以这样考虑:分跳3(本身值直接+1),跳1,跳2三种情况,跳1之后还剩f(3-1)种跳法,跳2之后

还有f(3-2)种跳法,所以f(3)可以等于这三种分法相加。类推f(n)=1+f(1)+f(2)+...+f(n-1)。

2的n-1次方

function jumpFloorII(number)  
{
    if(number <= 0){
        return 0;
    }
    var jump=1;
    for(var i=1;i<number;i++){
        jump*=2;
    }
    return jump;
}

function jumpFloorII(number) {  
   if(number<0){
       return 0;
   }
    return Math.pow(2,number-1);
}

 

10--我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

思想:n=1时,1种情况,n=2时,横着或竖着覆盖,两种情况。n=3时,横着、竖着、横竖混着,共3种情况。可以依次递推。

function rectCover(number)  
{
    if(number<=0){
        return 0;
    }
    var Fn=[1,2];
    for(var i=2;i<number;i++){
        Fn[i]=Fn[i-1]+Fn[i-2];
    }
    return Fn[number-1];
}

 

 

 

 

 

 

 

部分参考:https://zhuanlan.zhihu.com/imweb

 

posted @ 2017-06-10 16:15  安静的嘶吼  阅读(509)  评论(0编辑  收藏  举报