zoukankan      html  css  js  c++  java
  • 剑指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

    宝剑锋从磨砺出,梅花香自苦寒来。
  • 相关阅读:
    m113
    无题
    m102 SE赛
    m101 真*sb($huge 全场最瞎$)
    m100 的坑
    m99 然而并没有想出来标题!
    m98 lsc rp-- 赛
    csps2019AFO祭
    csps考前的一些总结(然而可能并没有用)
    低错总结
  • 原文地址:https://www.cnblogs.com/haimengqingyuan/p/6917433.html
Copyright © 2011-2022 走看看