剑指offer试题(PHP篇一)
1.二维数组中的查找
题目描述
<?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.替换空格
题目描述
<?php
function replaceSpace($str)
{// write code herereturn str_replace(" ","%20",$str);
}
运行时间:9ms 占用内存:2428k
感悟:
要熟悉str_replace()函数,参数一为要查找的值,参数二为替换的值,参数三为被搜索的字符串。
如果搜索的字符串是数组,那么它将返回数组,对数组中的每个元素进行查找和替换。注意,在数组替换中,如果需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换。
3.从尾到头打印链表
题目描述
<?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.重建二叉树
题目描述
<?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.用两个栈实现队列
题目描述
<?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.旋转数组的最小数字
题目描述
<?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<=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.跳台阶
题目描述
<?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.变态跳台阶
题目描述
<?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.矩形覆盖
题目描述
<?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
注:以上均为个人理解,如有错误,请提出,必改正。
转载于:https://www.cnblogs.com/zlnevsto/p/8448732.html
剑指offer试题(PHP篇一)相关推荐
- 【LeetCode】《剑指Offer》第Ⅴ篇⊰⊰⊰ 39 - 47题
[LeetCode]<剑指Offer>第Ⅴ篇⊰⊰⊰ 39 - 47题 文章目录 [LeetCode]<剑指Offer>第Ⅴ篇⊰⊰⊰ 39 - 47题 39. 数组中出现次数超过 ...
- 【LeetCode】《剑指Offer》第Ⅰ篇⊰⊰⊰ 3 - 11题
[LeetCode]<剑指Offer>第Ⅰ篇⊰⊰⊰ 3 - 11题 文章目录 [LeetCode]<剑指Offer>第Ⅰ篇⊰⊰⊰ 3 - 11题 03. 数组中重复的数字(ea ...
- 剑指offer试题系列
剑指offer之题目5 题目描述: 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%2 ...
- 二叉树代码 java面试题_《剑指offer》面试题39 二叉树的深度(java)
摘要: 今天翻到了<剑指offer>面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造.然而我翻了下别人的java版本(我就 ...
- 剑指offer面试题[30]-最小的k个数
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 分析思路: 这道题最简单的思路莫过于把输入的n个数排 ...
- 剑指Offer——当当+搜狐+好未来笔试题+知识点总结
剑指Offer--当当+搜狐+好未来笔试题+知识点总结 情景回想 时间:2016.9.21 15:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:当当笔试.搜狐笔试.好未来笔试 3 ...
- 【剑指Offer面试题】 九度OJ1510:替换空格
c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...
- 剑指offer 面试题三 找出数组中重复的数字
1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...
- 【剑指Offer学习】【全部面试题汇总】
剑指Offer学习 剑指Offer这本书已经学习完了.从中也学习到了不少的东西,如今做一个总的文件夹.供自已和大家一起參考.学如逆水行舟.不进则退.仅仅有不断地学习才干跟上时候.跟得上技术的潮流! 全 ...
最新文章
- 计算机视觉工具包Luminoth
- PPT快速制作精美3D柱状图
- Boost:bind绑定和或||的测试程序
- 实用知识点梳理:BGP协议、调制解调技术、路由特点、VOIP、FTP、Cookie、滑动窗口协议与自动重传请求
- 深入开展计算机设备保密检查,江西安远县检察院深入开展网络安全保密自查工作...
- 【Python】从键盘输入一个大于1的整数N,判断是否为素数
- Android 8.0学习(28)--- 解决OkHttp问题
- python之设计模式的装饰器9步学习
- Leetcode 347.前K个高频元素
- “21天好习惯“第一期-4
- DEDE 织梦 CMS 文章采集不到
- wowza流媒体服务器安全设置
- java 字符串练习(罗马数字的转换)
- Instrument详解
- 2.leapmotion之开发指南
- 想学Python,这68个内置函数你一定要搞定!
- Windows服务器C盘越来越大的原因
- 个人ACM模板(待持续补充)
- 如何裁剪视频画面尺寸?快把这些方法收好
- BODIPY493/503-alkyne/amine/azide/carboxylic acid/DBCO/hydrazide/maleimide/NHS /tetrazine氟化硼二吡咯衍生物