剑指offer试题(PHP篇一)
1.二维数组中的查找
题目描述
<?php function Find($target, $array)
{
// write code here
foreach($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 here
return 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 here
if($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 here
global $stack;
return $stack[]=$node;
}
function mypop()
{
global $stack;
if($stack){
return array_shift($stack);
}
// write code here
return $stack;
}
运行时间:14ms 占用内存:3688k
感悟:
首先要清楚队列的Push和Pop操作的含义:push(x):将x压入队列的末端,pop():弹出队列的第一个元素。
本题要点为定义全局数组$stack,其次为array_shift()函数:删除数组中的第一个元素,并返回被删除元素的值。
6.旋转数组的最小数字
题目描述
<?php function 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
<?php function Fibonacci($n)
{
// write code here
if($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.跳台阶
题目描述
<?php function 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.变态跳台阶
题目描述
<?php function jumpFloorII($number)
{
// write code here
if($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.矩形覆盖
题目描述
<?php function rectCover($number)
{
// write code here
if($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
注:以上均为个人理解,如有错误,请提出,必改正。
剑指offer试题(PHP篇一)的更多相关文章
- 剑指offer试题(PHP篇二)
6.旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1 ...
- 剑指offer试题(PHP篇四)
16.合并两个排序的链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 时间限制:1秒 空间限制:32768K <?php /*c ...
- 剑指offer试题(PHP篇三)
21.栈的压入.弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4 ...
- 剑指Offer——滴滴笔试题+知识点总结
剑指Offer--滴滴笔试题+知识点总结 情景回顾 时间:2016.9.18 15:00-17:00 地点:山东省网络环境智能计算技术重点实验室 事件:滴滴笔试 总体来说,滴滴笔试内容体量不算多, ...
- 《剑指offer》面试题39 二叉树的深度(java)
摘要: 今天翻到了<剑指offer>面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造.然而我翻了下别人的java版本(我就 ...
- 【剑指Offer面试题】 九度OJ1389:变态跳楼梯
转自:http://www.myexception.cn/program/1973966.html 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2331解决:1332 题目描述: 一只青蛙一次 ...
- 剑指offer之面试题2:实现Singleton模式
来源:剑指offer 这篇主要记录<剑指offer>书籍中的面试题2:实现Singleton模式 使用语言:C# 代码环境:VS2017 总共有5中解法,从前往后依次优化. 结构如下: 前 ...
- 剑指Offer面试题:1.实现Singleton模式
说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...
- 《剑指offer》面试题12:打印1到最大的n位数
面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...
随机推荐
- TCP为什么需要3次握手与4次挥手(转载)
为什么需要“三次握手” 在谢希仁著<计算机网络>第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”.在另一部经典的<计算机网络> ...
- 通过Git Gui Here上传本地项目到GitHub上
要使用此种方法上传本地项目到GitHub上,前提得是你已安装Git for window工具. Git for window下载地址:http://www.xp510.com/xiazai/Appli ...
- css中,如何设置前景色的透明度?
谢谢 我等待的他 | 浏览 255446 次 推荐于2016-01-13 12:27:03 最佳答案 css控制透明度倒不麻烦. filter:alpha(opacity=50); -moz-opac ...
- 邓_php面试【003】——完整版
php面试题汇总四(基础篇附答案) 1. 什么事面向对象?主要特征是什么? 面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰.主要特征:封装.继承.多态. 2. SESSION ...
- Hystrix-request cache(请求缓存)
开启请求缓存 请求缓存在run()和construce()执行之前生效,所以可以有效减少不必要的线程开销.你可以通过实现getCachekey()方法来开启请求缓存. package org.hope ...
- 关于今天esp8266运行失控问题和oled与串口共存尝试成功的总结
今天2017-12-1720:24:22下午esp8266再次无法刷入固件,导致我一度崩溃,本来已经认为esp8266已经相当稳定了,没想到今天又运行出错,总结如下 今天2017-12-17esp无法 ...
- SQL 优化经验总结34条(转)
(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最 ...
- java -cp用法
原文出处:http://blog.csdn.net/zhuying_linux/article/details/7714194.感谢作者的分享 java -cp classpath Specify a ...
- 如何通过命令或脚本方式在Windows上访问linux系统
很多情况下,我们需要在Windows上写脚本,创建计划任务程序,这个过程中可能需要访问linux系统,执行脚本或者上传下载文件.并且我们也不想在Windows上安装什么东西.那最好的办法就是使用put ...
- linkin大话面向对象--组合
继承是实现类重用的重要手段,但是它有一个最大的坏处:破坏封装.相比之下,组合也是实现类重用的重要方式,但是采用组合方式实现类重用则能提供更好的封装性.比如人有手一样,在人的类中增加一个手的属性. 何时 ...