剑指offer试题(PHP篇一)

1.二维数组中的查找

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
时间限制:1秒   空间限制:32768K
<?phpfunction Find($target, $array)
{// write code hereforeach($array as $k=>$v){if(in_array($target,$v)){return "true";}}  return "false";
}

运行时间:281ms   占用内存:4252k

感悟:

  这道题用PHP写起来比较简单,只要懂得二维数组的遍历,以及in_array()函数的使用,不要搞错参数位置,参数一为要查找的字符串,参数二为数组。

2.替换空格

题目描述

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
时间限制:1秒   空间限制:32768K
<?php
function replaceSpace($str)
{// write code herereturn str_replace(" ","%20",$str);
} 

运行时间:9ms   占用内存:2428k

感悟:

  要熟悉str_replace()函数,参数一为要查找的值,参数二为替换的值,参数三为被搜索的字符串。

  如果搜索的字符串是数组,那么它将返回数组,对数组中的每个元素进行查找和替换。注意,在数组替换中,如果需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换。

3.从尾到头打印链表

题目描述

输入一个链表,从尾到头打印链表每个节点的值。
时间限制:1秒   空间限制:32768K
<?php/*class ListNode{var $val;var $next = NULL;function __construct($x){$this->val = $x;}
}*/
function printListFromTailToHead($head)
{// write code here$list = array();while($head!=null){$list[]=$head->val;$head=$head->next;}return array_reverse($list);
} 

运行时间:18ms   占用内存:2432k

感悟:

  本题的思路为先将链表的值顺序装入一个空数组中,然后使用array_reverse()函数以相反的元素顺序返回数组。

4.重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
时间限制:1秒   空间限制:32768K
<?php/*class TreeNode{var $val;var $left = NULL;var $right = NULL;function __construct($val){$this->val = $val;}
}*/
function reConstructBinaryTree($pre, $vin)
{// write code hereif($pre && $vin){$treeRoot = new TreeNode($pre[0]);$index = array_search($pre[0],$vin);$treeRoot->left = reConstructBinaryTree(array_slice($pre,1,$index),array_slice($vin,0,$index));$treeRoot->right = reConstructBinaryTree(array_slice($pre,$index+1),array_slice($vin,$index+1));return $treeRoot;}
}

运行时间:35ms   占用内存:4204k

感悟:

  本题的思路为递归调用reConstructBinaryTree方法来分别执行左子树和右子树的遍历查找,每次都查找出根节点并进行保存。

  题中使用到的函数:array_search(),在数组(参数二)中搜索某个键值(参数一),并返回对应的键名,若没有找到,则返回false。

           array_slice(),在数组中根据条件取出一段值,并返回,参数一为数组,参数二为取值的起始位置(相当于数组下标),参数三为选取的长度(可选,若不填,则取到数组结尾)。

5.用两个栈实现队列

题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
时间限制:1秒    空间限制:32768K
<?php
$stack = array();
function mypush($node)
{// write code hereglobal $stack;return $stack[]=$node;
}
function mypop()
{global $stack;if($stack){return array_shift($stack);}// write code herereturn $stack;
}

运行时间:14ms   占用内存:3688k

感悟:

  首先要清楚队列的Push和Pop操作的含义:push(x):将x压入队列的末端,pop():弹出队列的第一个元素。

  本题要点为定义全局数组$stack,其次为array_shift()函数:删除数组中的第一个元素,并返回被删除元素的值。

6.旋转数组的最小数字

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
时间限制:3秒   空间限制:32768K
<?phpfunction minNumberInRotateArray($rotateArray)
{// write code here/*if(count($rotateArray) == 0){return 0;}$min = min($rotateArray);foreach($rotateArray as $k=>$v){if($v == $min){$arrLeft[] = array_slice($rotateaArray,0,$k+1);$arrRight[] = array_slice($rotateArray,$k+1);}}弄了半天不是让输出翻转后的数组。。。。*/if(count($rotateArray)){return min($rotateArray);}else{return 0;}
}

运行时间:985ms   占用内存:5156k

感悟:

  这道题告诉我一定要审题审题审题=  =|,本来自己在一味的求解反转后的数组,结果不知什么时候一看,发现只是让求最小数,对于php而言太简单了。。。不过对于这道题,还是要提醒大家细心(汗)。

7.斐波那契数列

题目描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。

n<=39

时间限制:1秒   空间限制:32768K

<?phpfunction Fibonacci($n)
{// write code hereif($n < 0 || $n > 39)return false;$ret = [];for($i = 0; $i <= $n; $i++){if($i == 0){$ret[$i] = 0;continue;}elseif($i == 1){$ret[$i] = 1;continue;}$ret[$i] = $ret[$i-1]+$ret[$i-2];}return $ret[$n];
}

运行时间:15ms   占用内存:2316k

感悟:

  这道题,只要理解斐波那契数列,知道用递归来实现就完全ok,再说思路,首先,排除掉不成立的情况,其次,将0和1的特殊情况拿出来单独赋值,最后,就是一般情况的循环递归。

8.跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
时间限制:1秒   空间限制:32768K
<?phpfunction jumpFloor($number)
{// write code here$arr = [];for($i=1;$i<=$number;$i++){if($i==1){$arr[1]=1;continue;}if($i==2){$arr[2]=2;continue;}$arr[$i]=$arr[$i-1]+$arr[$i-2];}return $arr[$number];
}

运行时间:9ms   占用内存:2316k

感悟:

  唯一的感受。。竟然撞题了= =,不废话,这道题按照一般的思路有些难解,但换种想法,比较倾向于找规律的解法,f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5,  可以总结出f(n) = f(n-1) + f(n-2)的规律,但是为什么会出现这样的规律呢?假设现在6个台阶,我们可以从第5跳一步到6,这样的话有多少种方案跳到5就有多少种方案跳到6,另外我们也可以从4跳两步跳到6,跳到4有多少种方案的话,就有多少种方案跳到6,其他的不能从3跳到6什么的啦,所以最后就是f(6) = f(5) + f(4);这样子也很好理解变态跳台阶的问题了,看到这里,你就会惊喜的发现!没错,就是斐波那契数列的问题,不过是少了0那种情况。

9.变态跳台阶

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
时间限制:1秒   空间限制:32768K
<?phpfunction jumpFloorII($number)
{// write code hereif($number == 1) return 1;return pow(2,($number - 1));
}  

运行时间:24ms   占用内存:2936k

感悟:

  因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级;

  跳1级,剩下n-1级,则剩下跳法是f(n-1);

  跳2级,剩下n-2级,则剩下跳法是f(n-2),

所以f(n)=f(n-1)+f(n-2)+...+f(1),因为f(n-1)=f(n-2)+f(n-3)+...+f(1),所以f(n)=2*f(n-1)

所以,f(n)=2的n-1次方。

当然,还要知道php的pow(x,y)函数,返回 x 的 y 次方。

10.矩形覆盖

题目描述

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
时间限制:1秒   空间限制:32768K
<?phpfunction rectCover($number)
{// write code hereif($number==0){return 0;}$arr = [];for($i=1;$i<=$number;$i++){if($i==1){$arr[1]=1;continue;}if($i==2){$arr[2]=2;continue;}$arr[$i]=$arr[$i-1]+$arr[$i-2];}return $arr[$number];
}

运行时间:29ms   占用内存:2928k

感悟:
走过的弯路:开始只是简单地将 n 分成奇、偶讨论,并将 2*2 作为基本单元。测试后通不过,代码就不贴出来献丑了。
思路分析:痛定思痛,还是不能够贪小便宜。用归纳法归纳如下,

(1)当 n < 1时,显然不需要用2*1块覆盖,按照题目提示应该返回 0。
(2)当 n = 1时,只存在一种情况。
 
(3)当 n = 2时,存在两种情况。
 
(4)当 n = 3时,明显感觉到如果没有章法,思维难度比之前提升挺多的。
 
... 尝试归纳,本质上 n 覆盖方法种类都是对 n - 1 时的扩展。
可以明确,n 时必定有 n-1时原来方式与2*1的方块结合。也就是说, f(n) = f(n-1) + ?(暂时无法判断)。
(4)如果我们现在归纳 n = 4,应该是什么形式?
4.1)保持原来n = 3时内容,并扩展一个 2*1 方块,形式分别为 “| | | |”、“= | |”、“| = |”
4.2)新增加的2*1 方块与临近的2*1方块组成 2*2结构,然后可以变形成 “=”。于是 n = 4在原来n = 3基础上增加了"| | ="、“= =”。
再自己看看这多出来的两种形式,是不是只比n = 2多了“=”。其实这就是关键点所在...因为,只要2*1或1*2有相同的两个时,就会组成2*2形式,于是就又可以变形了。
所以,自然而然可以得出规律: f(n) = f(n-1) + f(n-2), (n > 2)。
然后这个时候,你就会惊喜的发现,又回到斐波那契数列了。。。思路不再细说,有需要的朋友可以看7题和8题。

注:以上均为个人理解,如有错误,请提出,必改正。

posted on 2018-02-14 19:17 zlnevsto 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/zlnevsto/p/8448732.html

剑指offer试题(PHP篇一)相关推荐

  1. 【LeetCode】《剑指Offer》第Ⅴ篇⊰⊰⊰ 39 - 47题

    [LeetCode]<剑指Offer>第Ⅴ篇⊰⊰⊰ 39 - 47题 文章目录 [LeetCode]<剑指Offer>第Ⅴ篇⊰⊰⊰ 39 - 47题 39. 数组中出现次数超过 ...

  2. 【LeetCode】《剑指Offer》第Ⅰ篇⊰⊰⊰ 3 - 11题

    [LeetCode]<剑指Offer>第Ⅰ篇⊰⊰⊰ 3 - 11题 文章目录 [LeetCode]<剑指Offer>第Ⅰ篇⊰⊰⊰ 3 - 11题 03. 数组中重复的数字(ea ...

  3. 剑指offer试题系列

    剑指offer之题目5 题目描述: 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%2 ...

  4. 二叉树代码 java面试题_《剑指offer》面试题39 二叉树的深度(java)

    摘要: 今天翻到了<剑指offer>面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造.然而我翻了下别人的java版本(我就 ...

  5. 剑指offer面试题[30]-最小的k个数

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 分析思路:         这道题最简单的思路莫过于把输入的n个数排 ...

  6. 剑指Offer——当当+搜狐+好未来笔试题+知识点总结

    剑指Offer--当当+搜狐+好未来笔试题+知识点总结 情景回想 时间:2016.9.21 15:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:当当笔试.搜狐笔试.好未来笔试 3 ...

  7. 【剑指Offer面试题】 九度OJ1510:替换空格

    c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...

  8. 剑指offer 面试题三 找出数组中重复的数字

    1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...

  9. 【剑指Offer学习】【全部面试题汇总】

    剑指Offer学习 剑指Offer这本书已经学习完了.从中也学习到了不少的东西,如今做一个总的文件夹.供自已和大家一起參考.学如逆水行舟.不进则退.仅仅有不断地学习才干跟上时候.跟得上技术的潮流! 全 ...

最新文章

  1. 计算机视觉工具包Luminoth
  2. PPT快速制作精美3D柱状图
  3. Boost:bind绑定和或||的测试程序
  4. 实用知识点梳理:BGP协议、调制解调技术、路由特点、VOIP、FTP、Cookie、滑动窗口协议与自动重传请求
  5. 深入开展计算机设备保密检查,江西安远县检察院深入开展网络安全保密自查工作...
  6. 【Python】从键盘输入一个大于1的整数N,判断是否为素数
  7. Android 8.0学习(28)--- 解决OkHttp问题
  8. python之设计模式的装饰器9步学习
  9. Leetcode 347.前K个高频元素
  10. “21天好习惯“第一期-4
  11. DEDE 织梦 CMS 文章采集不到
  12. wowza流媒体服务器安全设置
  13. java 字符串练习(罗马数字的转换)
  14. Instrument详解
  15. 2.leapmotion之开发指南
  16. 想学Python,这68个内置函数你一定要搞定!
  17. Windows服务器C盘越来越大的原因
  18. 个人ACM模板(待持续补充)
  19. 如何裁剪视频画面尺寸?快把这些方法收好
  20. BODIPY493/503-alkyne/amine/azide/carboxylic acid/DBCO/hydrazide/maleimide/NHS /tetrazine氟化硼二吡咯衍生物

热门文章

  1. 分割数组的最大值—leetcode410
  2. 多数元素—leetcode169
  3. 指令集及流水线基本概念
  4. ashx 跨域_ASP.NET通用HTTP处理程序(ashx的),支持JSONP
  5. aftool提示15天未更新_微信版本更新至7.0.15 视频号新增3种功能
  6. 多重继承与虚继承编程实验
  7. pip 指定路径安装工具包
  8. 用户不见了_03 | 为什么你设计的信息用户总是看不见
  9. LTE小区选择和重选
  10. JAVA中使用XFire调用WebService接口