斐波那契数列
题目描述:
大家都知道斐波那契数列,现在要求输入一个整数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];
}
}
}