剑指offer

斐波那契数列

题目描述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n≤39

思路:
(1)斐波那契数列:这个数列从第3项开始,每一项都等于前两项之和。
(2)a为第一个数,b为第二个数,先用一个temp存储第二个数,将第二个数b替换为两个数之和(即后一个数),然后将temp保存的原本的第二个数赋值给a,此时的a又成为下一次循环的第一个数。不断循环

题解:

javascript
function Fibonacci(n)
{
    var a = 1, b = 1, temp;
    if(n <= 0){
        return 0;
    }else{
        for(i = 2; i <= n; i++){
            temp = b;
            b = a + b;
            a = temp;
        }
        return a;
    }
    
}

用两个栈实现队列

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

思路:
(1)
栈:后进先出
队列:先进先出
(2)
push时直接将数值存放进栈a。此时后进的数值会先出,先进的数值会后出
pop时,将栈a中的数值pop出(原本后进的数值先出来存储进栈b,就会在栈b pop时后出),push进栈b,这时再把栈b的数值pop出即可,然后重新将栈b数值放回进栈a,以便下次操作

题解:

var a = [];
var b = []

function push(node)
{
    a.push(node);
}
function pop()
{
    var temp = a.pop();
    while(temp){
        b.push(temp);
        temp = a.pop();
    }
    var result = b.pop();
    temp = b.pop();
    while(temp){
        a.push(temp);
        temp = b.pop();
    }
    return result;
}

旋转数组的最小数字

题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

思路:
(1)蛮力法
(2)遍历:遍历数组当发现小于前一个数的数值时,即为最小值
(3)二分查找:定义两个指针分别指向数组开头和结尾,比较mid的值与头尾的大小

题解:
(1)暴力法(不推荐)

function minNumberInRotateArray(rotateArray)
{
    if(rotateArray.length == 0){
        return 0;
    }
    return Math.min.apply(null,rotateArray);
}

(2)遍历

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

(3)二分法

function minNumberInRotateArray(rotateArray)
{
    var l=0,r=rotateArray.length-1;
    var mid;
    if(rotateArray[l]<rotateArray[r])return rotateArray[l];
    while(l<r){
        mid=Math.floor((l+r)/2);
        if(rotateArray[l]<=rotateArray[mid]){
            l=mid;
        }
        if(rotateArray[mid]<=rotateArray[r]){
            r=mid;
        }
        if(r-l==1){
                return rotateArray[r];
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值