剑指offer试题(PHP篇四)
16.合并两个排序的链表
题目描述
<?php
/*class ListNode{
var $val;
var $next = NULL;
function __construct($x){
$this->val = $x;
}
}*/
function Merge($pHead1, $pHead2)
{
// write code here
$pHead = new ListNode(null);
if($pHead1 == null){
return $pHead2;
}elseif($pHead2 == null){
return $pHead1;
}else{
if($pHead1->val<$pHead2->val){
$pHead=$pHead1;
$pHead->next=Merge($pHead1->next,$pHead2);
}else{
$pHead=$pHead2;
$pHead->next=Merge($pHead1,$pHead2->next);
}
}
return $pHead;
}
运行时间:13ms 占用内存:2560k
感悟:
思路很简单,按顺序合并两个有序的链表,只要针对 每个链表的第一个值进行比较,再递归调用Merge函数即可。
17.树的子结构
题目描述
<?php
/*class TreeNode{
var $val;
var $left = NULL;
var $right = NULL;
function __construct($val){
$this->val = $val;
}
}*/
function HasSubtree($pRoot1, $pRoot2)
{
// write code here
if($pRoot1 == null || $pRoot2 == null){
return false;
}
return isSubtree($pRoot1,$pRoot2) || isSubtree($pRoot1->left,$pRoot2) || isSubtree($pRoot1->right,$pRoot2);
}
function isSubtree($pRoot1,$pRoot2){
if($pRoot2 == null){
return true;
}
if($pRoot2 == null){
return false;
}
return $pRoot1->val == $pRoot2->val && isSubtree($pRoot1->left,$pRoot2->left) && isSubtree($pRoot1->right,$pRoot2->right);
}
运行时间:11ms 占用内存:2432k
感悟:
首先判断两个链表是否为空,若空则返false,若不空,则递归调用isSubtree函数,这里要注意调用时要将链表1本身,其左子树,其右子树分别和链表2进行比较,若链表1的比较不成立,再进行其左子树和右子树的调用比较,若链表1本身就成立,则后面的两次调用就没有必要。再来说isSubtree函数,题目要求判断b是不是a的子结构,所以分别判断传入参数的两个链表是否为空,若1空,则返回false,若2空,则肯定是子结构,返回true,最后用与运算递归调用isSubtree函数进行子树的比较。
18.二叉树的镜像
题目描述
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
时间限制:1秒 空间限制:32768K
<?php
/*class TreeNode{
var $val;
var $left = NULL;
var $right = NULL;
function __construct($val){
$this->val = $val;
}
}*/
function Mirror(&$root)
{
// write code here
if($root == null || ($root->left == null && $root->right == null)){
return;
}
$tmp = $root->left;
$root->left = $root->right;
$root->right = $tmp;
if($root->left){
Mirror($root->left);
}
if($root->right){
Mirror($root->right);
}
return $root;
}
运行时间:12ms 占用内存:2428k
感悟:
首先判断该二叉树是否为空树或者是否只有一个节点,若不是,则进行左右子节点的交换,最后将左右节点分别判断,再递归调用原函数Mirror()。
19.顺时针打印矩阵
题目描述
function printMatrix($matrix)
{
// write code here
$output = [];
$left = 0;
$right = count($matrix[0]);
$top = 0;
$buttom = count($matrix);
if ($right == 0 && $buttom == 0) {
return $output;
}
$right--;
$buttom--;
while($left <= $right && $top <= $buttom) {
for ($i = $left; $i <= $right; $i++) $output[] = $matrix[$top][$i];
if ($top + 1 > $buttom) break;
for ($i = $top + 1; $i <= $buttom; $i++) $output[] = $matrix[$i][$right];
if ($right - 1 < $left) break;
for ($i = $right - 1; $i >= $left; $i--) $output[] = $matrix[$buttom][$i];
if ($buttom - 1 <= $top) break;
for ($i = $buttom -1 ; $i > $top; $i--) $output[] = $matrix[$i][$left];
$left++;
$right--;
$top++;
$buttom--;
}
return $output;
}
运行时间:22ms 占用内存:7808k
感悟:
顺时针打印矩阵中的数值,把握好变量的取值,先判断给出的数组是否为空,之后根据top,buttom,left,right四个变量进行左到右,上到下,右到左,下到上的遍历赋值,进行一遍循环后,矩形缩小一圈,左加右减,上加下减,继续遍历,直到left大于等于right且top大于等于buttom,循环结束,输出output数组。
20.包含min函数的栈
题目描述
<?php
global $mystack;
$mystack = [];
function mypush($node)
{
// write code here
global $mystack;
array_push($mystack,$node);
}
function mypop()
{
// write code here
global $mystack;
array_pop($mystack);
}
function mytop()
{
// write code here
global $mystack;
if(count($mystack) == 0){
return null;
}
return $mystack[count($mystack)-1];
}
function mymin()
{
// write code here
global $mystack;
$min = $mystack[0];
for($i=0;$i<count($mystack);$i++){
if($mystack[$i]<$min){
$min = $mystack[$i];
}
}
return $min;
}
运行时间:11ms 占用内存:2432k
感悟:
考察栈的操作,注意定义global变量,进栈出栈,返回栈顶元素,求栈中最小元素,按照一般思路求解即可。
注:以上均为个人理解,如有错误,请提出,必改正。
剑指offer试题(PHP篇四)的更多相关文章
- 剑指Offer(三十四):第一个只出现一次的字符
剑指Offer(三十四):第一个只出现一次的字符 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...
- 剑指Offer(二十四):二叉树中和为某一值的路径
剑指Offer(二十四):二叉树中和为某一值的路径 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
- 剑指offer试题(PHP篇二)
6.旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1 ...
- 剑指offer试题(PHP篇一)
1.二维数组中的查找 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- 剑指offer试题(PHP篇三)
21.栈的压入.弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4 ...
- 《剑指offer》第十四题(剪绳子)
// 面试题:剪绳子 // 题目:给你一根长度为n绳子,请把绳子剪成m段(m.n都是整数,n>1并且m≥1). // 每段的绳子的长度记为k[0].k[1].…….k[m].k[0]*k[1]* ...
- 《剑指offer》第二十四题(反转链表)
// 面试题24:反转链表 // 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的 // 头结点. #include <iostream> #include &quo ...
- 干货 | 剑指offer系列文章汇总
下面是名企面试中经常会出现的面试题目,大家可以戳相应的题目查看题目细节,其答案会在紧接着的后一篇中出现 剑指offer系列 始 剑指offer—灯管问题(1) 剑指offer—10人电梯(2) ...
- 剑指offer之面试题2:实现Singleton模式
来源:剑指offer 这篇主要记录<剑指offer>书籍中的面试题2:实现Singleton模式 使用语言:C# 代码环境:VS2017 总共有5中解法,从前往后依次优化. 结构如下: 前 ...
随机推荐
- java 跳出多层循环
lableB: for(int i=0;i<10;i++){ lableA: for(int j=0;j<10;j++){ System.out.println(j); if(j==1){ ...
- dede 你所上传的软件类型不在许可列表,请更改系统对扩展名限定的配置
后台,系统,系统基本参数,附件设置格式
- 基于TI CC2650的IPv6 over BLE(BLEach) demo
虽然BLE 5.0协议理论上已经开始支持IPv6了,但是目前市面上还没有可用的实现IPv6通信的BLE产品. 最近在网上看到一个开源的基于contiki系统,在CC2650上实现的IPv6 over ...
- 系列3|走进Node.js之多进程模型
文:正龙(沪江网校Web前端工程师) 本文原创,转载请注明作者及出处 之前的文章"走进Node.js之HTTP实现分析"中,大家已经了解 Node.js 是如何处理 HTTP 请求 ...
- Spring学习之路二——概念上理解Spring
一.概念. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Develop ...
- [知了堂学习笔记]_记一次BootStrap的使用
效果图如下: 一.简介: 什么是Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架. 什么是响应式布局? 引用一句Bootstrap的标题语 " ...
- Vuejs 安装与配置
1.全局安装 vue-cli $ npm install --global vue-cli 2.创建一个基于 webpack 模板的新项目 $ vue init webpack my-project ...
- mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理
转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有 ...
- [转]同一台Windows机器中启动多个Memcached服务
Memcached的安装后,如果手头上只有一台机器,又想做多节点测试咋办? 这就需要在一台机器上启动多个Memcached服务了. 假设Memcached在如下目录:C:\memcached\memc ...
- Django_MTV视图
WEB服务请求流程? 用户请求通过url,url带着用户的用户信息封装成request,然后服务器收到url请求,激活获取url中带来的request,服务器处理request逻辑后,返回封装好的re ...