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”赋值到str1str1+="%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 =0this.psh=pshthis.empty=emptythis.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)
{ functionif(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

转载于:https://www.cnblogs.com/haimengqingyuan/p/6917433.html

剑指offer の 1-10 之javascript实现相关推荐

  1. 剑指 Offer 03——10

    @Author:Runsen 决定重新刷剑指 Offer,C++和Py版本 03. 数组中重复的数字 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 方法: 排序 遍历.set和 ...

  2. 剑指offer Leetcode 10 I .斐波那契数列

    解法1:效率低的解法 复杂度 速度十分缓慢,重复计算太多 代码 //未考虑溢出和取模 class Solution {public:int fib(int n) {if(n <= 0)retur ...

  3. 剑指offer第二版答案详细版(带详细解题思路)

    1.滑动窗口的最大值(剑指offer原59题) 解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素:首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入 ...

  4. 《剑指 Offer》题目汇总

    文章目录 1. 数组 2. 链表 3. 栈和队列 4. 哈希表 5. 字符串 6. 树 7. 堆 8. 回溯和深度优先搜索 9. 递归和循环 10. 双指针 11. 动态规划 12. 贪心算法 13. ...

  5. 【剑指offer】数据结构——数组

    目录 数据结构--数组 直接解 [剑指offer]03.数组中重复的数字 排序法 集合法 原地置换 [剑指offer]04. 二维数组中的查找 [剑指offer]29. 顺时针打印矩阵 [剑指offe ...

  6. 《剑指 Offer I》刷题笔记 1 ~10 题

    <剑指 Offer I>刷题笔记 1 ~10 题 栈与队列(简单) 1. 用两个栈实现队列 _解法 1:暴力做法 解法 2:优化解法 1 2. 包含 min 函数的栈 _解法 1:pop( ...

  7. 剑指offer——面试题10:二进制中1的个数

    剑指offer--面试题10:二进制中1的个数 关于负数的自己没想出来,这是书中的两种算法,关于位运算的知识还是得要学习一个啊... Solution1: class Solution {public ...

  8. 剑指Offer(10)有环链表 翻转链表

    剑指offer(10) 有环链表 反转链表 题目: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 思路: 快慢指针,当前一个指针和后一个指针相遇时,有环,提前结束则无. ...

  9. 剑指offer刷题 --前端(javascript)

    剑指offer 1.二维数组中的查找 题目描述 思路 代码 2.替换空格 题目描述 思路 代码 3.从尾到头打印链表 题目描述 思路 代码 4.重建二叉树 题目描述 思路 代码 5.用两个栈实现队列 ...

  10. 剑指Offer #10 矩形覆盖(问题分析)

    题目来源:牛客网-剑指Offer专题 题目地址:矩形覆盖 题目描述 我们可以用2∗12*12∗1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2∗12*12∗1的小矩形无重叠地覆盖一个2∗n2*n2 ...

最新文章

  1. layui select 与 vue 的结合使用
  2. 5、计算机图形学——着色与光照模型
  3. [Python] L1-024. 后天-PAT团体程序设计天梯赛GPLT
  4. 两个选择框 ajax如何根据另一个选择框的内容获取_Python数据结构:数据框
  5. restful接口的设计规范
  6. 时钟偏移(Skew)和时钟抖动(Jitter)
  7. .NET面试题精简版
  8. java 泛型去重_泛型,list集合去重
  9. 如何把TS视频文件转换为MP4格式?
  10. 高中数学排列组合公式/排列组合计算公式
  11. 手机linux发短信的命令,用AT指令操作短信猫发短信
  12. python mse_python 计算平均平方误差(MSE)的实例
  13. Github pages + Hexo 博客 yilia 主题使用畅言评论系统
  14. Stm32F04 时钟配置
  15. 二次验证码小程序与谷歌身份验证器不同点是?
  16. 严冬欲御寒增强体质 首当养肾
  17. win10未检测到其他显示器
  18. filebeat 收集json格式_Filebeat 采集日志实践经验记录
  19. 输入法导致input内容错误
  20. Linux中的编辑器 - vim

热门文章

  1. (1) 漂亮的日期控件
  2. 从程序员到CTO的Java技术路线图 (转自安卓巴士)
  3. vs2012打包和部署程序成可安装安装包文件(InstallShield
  4. font-size用VW来写的方法
  5. 22-while循环
  6. resnet18到resnet152模型pytorch实现
  7. TensorFlow学习笔记(二)MNIST入门
  8. 详解log4j2(下) - 按日志级别区分文件输出
  9. jvm系列(四):jvm调优-命令篇
  10. JavaScript语言特性