剑指Offer

二维数组中的查找

描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。

题解答案
function Find(target, array)
{
    let i=0,j=array[0].length-1;
    while(true){
        if(array[i][j]==target)
            return true;
        else if(array[i][j]>target)
            j--;
        else
            i++;
        if(i<0||j<0||i==array.length||j==array[0].length)
            return false;
    }
}

从尾到头打印链表

描述

输入一个链表,按链表从尾到头的顺序返回一个ArrayList

题解答案
function printListFromTailToHead(head)
{
    let arr=[];
    while(head){
        arr.push(head.val);
        head=head.next;
    }
    return arr.reverse();
}

重建二叉树

描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

题解答案
function reConstructBinaryTree(pre, vin) {
    if(!pre.length||!vin.length)
        return;
    let i=0;
    let tree=new TreeNode(pre[0]);
    for(;i<vin.length;i++){
        if(pre[0]==vin[i])
            break;
    }
    tree.left=reConstructBinaryTree(pre.slice(1,i+1),vin.slice(0,i));
    tree.right=reConstructBinaryTree(pre.slice(i+1),vin.slice(i+1));
    return tree;
}

用两个栈实现队列

描述

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

题解答案
const inStack=[],outStack=[];
function push(node)
{
    inStack.push(node);//没有返回值
}
function pop()
{
    if(outStack.length)//栈2中有的话,直接出栈
        return outStack.pop();
    while(inStack.length)//栈2中没东西,只要栈1不为空
        outStack.push(inStack.pop());//栈1出栈,栈2入栈
    return outStack.pop();
}

斐波那契数列

题解答案

不能用栈啊,会溢出(不要有惯性思维)。这里可以用迭代。

function Fibonacci(n)
{
    if(n==0)
        return 0;
    if(n==1)
        return 1;
    let num,num1=0,num2=1;
    for(let i=2;i<=n;i++){
        num=num1+num2;
        num1=num2;
        num2=num;
    }
    return num;
}

跳台阶

描述

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

思路

我是把number写到了5才找到规律,看了答案才知道原理:

如果青蛙当前在第n级台阶上,那它上一步是在哪里呢?
显然,由于它可以跳1级台阶或者2级台阶,所以它上一步必定在第n-1,或者第n-2级台阶,也就是说它跳上n级台阶的跳法数是跳上n-1和跳上n-2级台阶的跳法数之和。

跳台阶扩展问题

描述

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

题解答案(绝绝子)

每个台阶都有跳与不跳两种情况(除了最后一个台阶),最后一个台阶必须跳。所以共有2^(n-1)种情况

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

二进制中1的个数

描述

输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示

题解答案

数值的整数次方

描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

题解答案

但是不是最优的

function Power(base, exponent)
{
    let result=1;
    let exponent1=exponent>0?exponent:-exponent;
    for(let i=1;i<=exponent1;i++){
        result*=base;
    }
    result=exponent<0?1.0/result:result;
    return result;
}

调整数组顺序使奇数位于偶数前面

描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

题解答案

①准备两个数组

function reOrderArray( array ) {
    let arr1=[],arr2=[];
    array.forEach(item=>{
        if(item%2!=0)
            arr1.push(item);
        else
            arr2.push(item);
    })
    return arr1.concat(arr2);
}

②冒泡排序

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值