剑指offer の 1-10 之javascript实现
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

浙公网安备 33010602011771号