剑指offer在线编程(一)

 

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

 

function Find(target, array)
{
    for(var i=array.length-1;i>=0;i--){
        for(var j=0;j<array[i].length;j++){
            if(array[i][j]<target){
                continue;
            }else if(array[i][j]>target){
                break;
            }else{
                return true;
            }
        }
    }
    return false;
}

分析:从左下角开始查找,array[i][j]大,向上找;array[i][j]小,向右找;相等返回true。
2、题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
答案:

function replaceSpace(str)
{
    return str.replace(/\s/g,"%20");
}

3、题目描述
输入一个链表,从尾到头打印链表每个节点的值。
答案:

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

3、题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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)
{
    if(pre.length==0||vin.length==0){
        return null;
    }
    var treeRoot=new TreeNode(pre[0]);	//构造根节点
    var indexRoot=vin.indexOf(pre[0]);	//在中序序列中查找根节点
    treeRoot.left=reConstructBinaryTree(pre.slice(1,indexRoot+1),vin.slice(0,indexRoot));	//递归构造左子树
    treeRoot.right=reConstructBinaryTree(pre.slice(indexRoot+1),vin.slice(indexRoot+1));	//递归构造右子树
    return treeRoot;
}

说明:
拓展:已知后序遍历序列{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(nex, vin){
    if(nex.length==0||vin.length==0){
        return null;
    }
    var treeRoot=new TreeNode(nex[nex.length-1]);	//构造根节点
    var indexRoot=vin.indexOf(nex[nex.length-1]);	//在后序序列中查找根节点
    treeRoot.left=reConstructBinaryTree(nex.slice(0,indexRoot),vin.slice(0,indexRoot));	//递归构造左子树
    treeRoot.right=reConstructBinaryTree(nex.slice(indexRoot,nex.length-1),vin.slice(indexRoot+1));	//递归构造右子树
    return treeRoot;
}
console.log(reConstructBinaryTree([1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]));

说明:
4、题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
答案:

var stack=[];
function push(node)
{
    return stack.push(node);
}
function pop()
{
    return stack.shift();
}

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

function minNumberInRotateArray(rotateArray)
{
    if(!rotateArray.length){
        return 0;
    }
    return Math.min(...rotateArray);
}

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

function Fibonacci(n){
    if(n<=0){
        return 0;
    }
    if(n<=2){
        return 1;
    }
    if(n<=39){
        var arr=[1,1];
        for(var i=2;i<n;i++){
            arr[i]=arr[i-1]+arr[i-2];
        }
        return arr[n-1]; 
    }
}

7、(套路)一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
答案:
分析:
a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);
b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)
c.由a,b假设可以得出总跳法为: f(n) = f(n-1) + f(n-2) 
d.然后通过实际的情况可以得出:只有一阶的时候 f(1) = 1 ,只有两阶的时候可以有 f(2) = 2
e.可以发现最终得出的是一个斐波那契数列:
        
              | 1, (n=1)
f(n) =     | 2, (n=2)
              | f(n-1)+f(n-2) ,(n>2,n为整数)
答案:

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

8、一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析:
如果n种跳法,1阶,2阶,...n阶;
a.假定第一次跳的是1阶,那么剩下的是n-1个台阶,跳法是f(n-1);
b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2);
......
   假定第一次跳的是n-1阶,那么剩下的是1个台阶,跳法是f(1);
c.由a,b假设可以得出总跳法为: f(n) = f(n-1) + f(n-2) +...+f(1);
d.然后通过实际的情况可以得出:
f(1)=1;
f(2)=f(1)+1=2;
f(3)=f(2)+f(1)+1=4;
f(4)=f(3)+f(2)+f(1)+1=8;
f(5)=f(4)+f(3)+f(2)+f(1)+1=16;
即:f(n)=2^(n-1);
答案:

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

9、我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
分析:
(1)当 n < 1时,显然不需要用2*1块覆盖,按照题目提示应该返回 0。
(2)当 n = 1时,只存在一种情况。
(3)当 n = 2时,存在两种情况。
(4)当 n = 2时,f(n)=f(n-1)+f(n-2)
总结:一般的,如果用m*1的方块覆盖m*n区域,递推关系式为f(n) = f(n-1) + f(n-m),(n > m)。
答案:

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

10、输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
分析:把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。如1100减1得到1011,再1100&1011=1000.
答案:

function NumberOf1(n){	
	var count=0;
    while (n!=0) {
    	n=n&(n-1);
    	count++;
    }
    return count;
}

说明:如果输入的是负数,计算机自动会转成补码的形式表示 ,不用纠结于此!
补充:数字+"0"是string类型;数字型字符串(如"12")-0是number类型;
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明致成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值