21.栈的压入、弹出序列

题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
时间限制:1秒    空间限制:32768K
<?php

function IsPopOrder($pushV, $popV)
{
// write code here
$stack = new SplStack;
$count = count($pushV);
for($i=0,$j=0;$i<$count;$i++){
$stack->push($pushV[$i]);
while(!$stack->isEmpty()&&$stack->top()==$popV[$j]&&$j<$count){
$stack->pop();
$j++;
}
}
return $stack->isEmpty();
}

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

思路:

  借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。

22.从上往下打印二叉树

题目描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。
时间限制:1秒    空间限制:32768K
<?php

/*class TreeNode{
var $val;
var $left = NULL;
var $right = NULL;
function __construct($val){
$this->val = $val;
}
}*/
function PrintFromTopToBottom($root)
{
// write code here
$queue = array();
$list = array();
array_push($queue,$root);
while(count($queue)>0){
array_push($list,$queue[0]->val);
$tmp = array_splice($queue,0,1);
if($tmp[0]->left != null){
array_push($queue,$tmp[0]->left);
}
if($tmp[0]->right != null){
array_push($queue,$tmp[0]->right);
}
}
return $list;
}
运行时间:10ms    占用内存:4068k
思路:
  先建两个空数组,将$root里的元素加到空数组$queue中,然后,将$queue中第一个的值放入$list(该数组用来存放每个节点的值)中,然后将$queue的第一个值删除,将剩余值放入临时数组$tmp中,通过判断$tmp[0]的左右是否为null,来判断二叉树的左右节点是否存在,从而将他们放入到$queue中继续循环,若$queue的数量为0,则循环结束,返回$list。
 
 
23.二叉搜索树的后序遍历序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
时间限制:1秒   空间限制:32768K

<?php

function VerifySquenceOfBST($sequence)
{
// write code here
$size = count($sequence);
if($size == 0){
return false;
}
$i = 0;
while($size--){
while($sequence[$i++]<$sequence[$size]);
while($sequence[$i++]>$sequence[$size]);
if($i<$size){
return false;
}
$i = 0;
}
return true;
}

运行时间:12ms    占用内存:2572k

思路:

  只要想清楚左节点比根节点小,右节点比根节点大就很容易解出,首先将数组的大小赋给$size,对$size进行while循环,这里有一个很重要的变量$i,两个while循环一个判断左节点和根节点的大小关系,若左小于根,则$i++,继续循环,之后判断右是否大于根,若大于,$i++,然后判断变量i和变量size的大小关系,如果i小于size,则说明没有循环完,即这不是一个二叉搜索树,返回false,反之则继续size--循环,当然要将i重新赋值0,直到size为0时,循环结束,返回true。

24.二叉树中和为某一值的路径

题目描述

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
时间限制:1秒    空间限制:32768K
<?php

/*class TreeNode{
var $val;
var $left = NULL;
var $right = NULL;
function __construct($val){
$this->val = $val;
}
}*/
function FindPath($root, $expectNumber)
{
// write code here
$arr = $tmp = [];
if(!$root){
return $arr;
}
find($root,$expectNumber,$arr,$tmp);
return $arr;
} function find($root,$sum,&$arr,$tmp){
if($root!= null){
$sum-=$root->val;
$tmp[] = $root->val;
if($sum>0){
find($root->left,$sum,$arr,$tmp);
find($root->right,$sum,$arr,$tmp);
}elseif($sum==0 && $root->left == null && $root->right == null){
$arr[] = $tmp;
}
}
}

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

思路:

  一个简单的递归函数,通过把每次减去的根节点的值存入临时数组tmp中,最后进行判断是否减到了零,并且是叶子节点,若是,再将tmp数组中的数转移到arr数组中,输出。

25.复杂链表的复制

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
时间限制:1秒    空间限制:32768K

<?php
/*class RandomListNode{
var $label;
var $next = NULL;
var $random = NULL;
function __construct($x){
$this->label = $x;
}
}*/
$r = [];
function MyClone($pHead)
{
// write code here
global $r;
if($pHead == NULL){
return NULL;
}
$PnewHead=new RandomListNode($pHead->label);
$PnewHead->next=MyClone($pHead->next);
$PnewHead->random=$pHead->random;
return $PnewHead;
}

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

思路:

  复杂链表是一种不太常见的数据结构,而且复制这种链表的过程也较为复杂,这里有一个小坑,就是找当前节点的下一个节点时用的是递归,但找他的random节点时只需要复制$pHead->random就行了,用不到递归。

26.二叉搜索树与双向链表

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

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

<?php
/*class TreeNode{
var $val;
var $left = NULL;
var $right = NULL;
function __construct($val){
$this->val = $val;
}
}*/
$nodes = array();
function Convert($pRootOfTree)
{
// write code here
GLOBAL $nodes;
$nodes = array();
inOrder($pRootOfTree);
for($i=0;$i<count($nodes)-1;$i++){
$nodes[$i]->right = $nodes[$i+1];
$nodes[$i+1]->left = $nodes[$i];
}
return $nodes[0];
} function inOrder($root){
GLOBAL $nodes;
if($root == null){
return;
}else{
inOrder($root->left);
$nodes[] = $root;
inOrder($root->right);
}
}

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

思路:

  这种方法的思路就是首先递归将搜索二叉树中的节点按照中序遍历的顺序存入到nodes中,然后对nodes进行遍历,使他相邻两个值互为左右子节点(双向链表)。

27.字符串的排列

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
时间限制:1秒 空间限制:32768K

<?php

function Permutation($str)
{
$ans = array();
permutation2(0,$str,$ans);
$ans = array_unique($ans);
sort($ans);
return $ans;
} function permutation2($step,&$str,&$ans){
if($step==strlen($str)-1){
$ans[] = $str;
}
for($i=$step;$i<strlen($str);$i++){
$tmp = $str[$step]; $str[$step] = $str[$i]; $str[$i] = $tmp;
permutation2($step+1,$str,$ans);
$tmp = $str[$step]; $str[$step] = $str[$i]; $str[$i] = $tmp;
}
}

运行时间:12ms    占用内存:3936k

思路:

  利用递归,通过对step位数的控制,每次交换两个字母的位置,将所有可能的情况罗列出来,存入ans数组中,最后将其去重,排序,即可得到最终结果。

28.数组中出现次数超过一半的数字

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

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

<?php

function MoreThanHalfNum_Solution($numbers)
{
// write code here
if(count($numbers) <= 0)
return 0;
$list = array_count_values($numbers);
$max = max($list);
if(2*$max > count($numbers))
return array_search($max, $list);
else
return 0;
}

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

思想:

  博主在这里偷懒了,使用了php的函数array_count_values,将数组中所有值当做下标,出现的次数当做值放入一个新的数组中,瞬间发现这个题简单了好多,找到数组中最大值的那一项,判断最大值的二倍与原数组长度谁大,来返回结果。

29.最小的K个数

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
时间限制:1秒    空间限制:32768K
<?php

function GetLeastNumbers_Solution($input, $k)
{
// write code here
sort($input);
$res = [];
if(count($input)>0 && count($input)>=$k){
$res = array_slice($input,0,$k);
return $res;
}else{
return $res;
} }

运行时间:17ms   占用内存:3940k

思路:

  先排序,然后使用array_slice,取出数组中前k个值,放入res数组中,返回即可,注意判断输入的数组和k是否符合范围,若不符合就返回空数组。

30.连续子数组的最大和

题目描述

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是1)
时间限制:1秒    空间限制:32768K
<?php

function FindGreatestSumOfSubArray($array)
{
// write code here
$count = count($array);
$max = $array[0];
for($i=0;$i<$count;$i++){
$sum = 0;
for($j=$i;$j<$count;$j++){
$sum+=$array[$j];
if($sum>$max){
$max = $sum;
}
}
}
return $max;
}

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

思路:

  双层循环遍历,找出一个和最大的值,并返回这个和。

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

剑指offer试题(PHP篇三)的更多相关文章

  1. 剑指offer试题(PHP篇一)

    1.二维数组中的查找 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  2. 剑指offer试题(PHP篇二)

    6.旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1 ...

  3. 剑指offer试题(PHP篇四)

    16.合并两个排序的链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 时间限制:1秒    空间限制:32768K <?php /*c ...

  4. 【Warrior刷题笔记】剑指offer 6 24 35. 三道题,让你学会链表递归迭代辅助栈

    题目一 从尾到头打印链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-l ...

  5. 剑指offer 面试65题

    题目65题:不用加减乘除做加法. 解法一:Python特性 # -*- coding:utf-8 -*- class Solution: def Add(self, num1, num2): # wr ...

  6. 剑指Offer——滴滴笔试题+知识点总结

    剑指Offer--滴滴笔试题+知识点总结 情景回顾 时间:2016.9.18 15:00-17:00 地点:山东省网络环境智能计算技术重点实验室 事件:滴滴笔试   总体来说,滴滴笔试内容体量不算多, ...

  7. 剑指offer之面试题2:实现Singleton模式

    来源:剑指offer 这篇主要记录<剑指offer>书籍中的面试题2:实现Singleton模式 使用语言:C# 代码环境:VS2017 总共有5中解法,从前往后依次优化. 结构如下: 前 ...

  8. 剑指Offer面试题:1.实现Singleton模式

    说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...

  9. 《剑指offer》面试题12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

随机推荐

  1. debian 7 终端上无法调出输出法

    debian 7 终端konsole上无法调出输出法,无法输入汉字的问题解决方案, export GTK_IM_MODULE=fcitxexport QT_IM_MODULE=fcitxexport ...

  2. 【转】Android 内核初识(6)SystemServer进程

    简介 SystemServer的进程名实际上叫做“system_server”,通常简称为SS. 系统中的服务驻留在其中,常见的比如WindowManagerServer(Wms).ActivityM ...

  3. 【转】 Android应用内多进程分析和研究

    正常情况下,一个apk启动后只会运行在一个进程中,其进程名为AndroidManifest.xml文件中指定的应用包名,所有的基本组件都会在这个进程中运行.但是如果需要将某些组件(如Service.A ...

  4. logstash 匹配日志格式

    2017-05-15 12:06:17 INFO  me.cinyi.imapp.push.commons.iospush  - 用户ID[1000]-标识[11500], admin推送通知成功, ...

  5. 最易懂的layui分页

    该篇文章是在layui前端框架之分页基础上简洁化和详细化. 首先该示例采用的是Spring+MyBatis Plus+SpringMVC(常规的SSM框架),持久层换成MyBatis也行. 至于lay ...

  6. Mysql 多实例实施步骤

    基本理论:利用同一套安装程序,不同配置文件,不同启动程序,不同数据目录.有公用资源,也有私有资源. 实现步骤: 1.正常安装mysql,二进制安装或者编译安装. 2.创建mysql多实例总目录,总目录 ...

  7. layer关闭当前窗口并刷新父窗口

    window.parent.location.reload(); var index = parent.layer.getFrameIndex(window.name); parent.layer.c ...

  8. HDU 1257 最少拦截系统(贪心 or LIS)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1257 最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)   ...

  9. python 位置参数和关键字参数 *args **kwargs

    #!/usr/bin/env pythondef foo(*args,**kwargs): print('args: {0}'.format(args)) print('kwargs {0}'.for ...

  10. p​o​s​t​m​a​r​k​使​用

    一.Postmark原理 Postmark是由着名的NAS提供商NetApp开发,用来测试其产品的后端存储性能. Postmark主要用于测试文件系统在邮件系统或电子商务系统中性能,这类应用的特点是: ...