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--用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为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