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类型;