16.合并两个排序的链表

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
时间限制:1秒    空间限制:32768K
<?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.树的子结构

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
时间限制:1秒    空间限制:32768K
<?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.顺时针打印矩阵

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
时间限制:1秒   空间限制:32768K

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函数的栈

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
时间限制:1秒   空间限制:32768K
<?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篇四)的更多相关文章

  1. 剑指Offer(三十四):第一个只出现一次的字符

    剑指Offer(三十四):第一个只出现一次的字符 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  2. 剑指Offer(二十四):二叉树中和为某一值的路径

    剑指Offer(二十四):二叉树中和为某一值的路径 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

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

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

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

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

  5. 剑指offer试题(PHP篇三)

    21.栈的压入.弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4 ...

  6. 《剑指offer》第十四题(剪绳子)

    // 面试题:剪绳子 // 题目:给你一根长度为n绳子,请把绳子剪成m段(m.n都是整数,n>1并且m≥1). // 每段的绳子的长度记为k[0].k[1].…….k[m].k[0]*k[1]* ...

  7. 《剑指offer》第二十四题(反转链表)

    // 面试题24:反转链表 // 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的 // 头结点. #include <iostream> #include &quo ...

  8. 干货 | 剑指offer系列文章汇总

    下面是名企面试中经常会出现的面试题目,大家可以戳相应的题目查看题目细节,其答案会在紧接着的后一篇中出现  剑指offer系列  始 剑指offer—灯管问题(1)  剑指offer—10人电梯(2)  ...

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

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

随机推荐

  1. [国嵌笔记][027][ARM协处理器访问指令]

    协处理器作用 协处理器用于执行特定的处理任务,如数学协处理器可以执行控制数字处理,以减轻处理器的负担.ARM处理器最多可以支持16个协处理器,其中CP15是最重要的一个协处理器 CP15的作用 CP1 ...

  2. python基础2 day3

    一.上节回顾 1,while else2,格式化输出name = input('>>>')s1 = '我叫%s,今年%d岁'%(name,18)dic1name = input('& ...

  3. web框架前言与学生数据库系统(附1.0源码)

    对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. import socket def f1(request): ""&quo ...

  4. windows下更改mysql数据储存物理目录

    windows10 1.停止mysql服务 以管理员身份运行cmd 输入命令 net stop mysql57 (我的mysql版本是5.7的,具体名称以你当前版本为主) 也可以打开任务管理器找到上面 ...

  5. Spark高可用集群搭建

    Spark高可用集群搭建 node1    node2    node3   1.node1修改spark-env.sh,注释掉hadoop(就不用开启Hadoop集群了),添加如下语句 export ...

  6. dede织梦栏目页和文章页中获取当前栏目名称方法

    一般情况下,在dede织梦系统中列表页.栏目页和文章页中获取当前所在栏目名称只需要代码:{dede:type}[field:typename]{/dede:type}即可,不需要定义ID,默认的就是当 ...

  7. s​q​l​i​t​e​3​-​入​门​教​程

    *** 非常好 http://wenku.baidu.com/link?url=xDoS4prJaGRac0QS0nxdNr6056N-qJIfZ7OhiTharj1ntuIsNy9sWXWvBXLh ...

  8. MySQL浅谈 LEFT JOIN

    On条件(在“A left join b on conditional_expr”)决定如何从table B 中检索数据行(Matching-State); 如果B中没有行匹配On 条件,额外的B的所 ...

  9. git学习网址

    git的学习网址:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/

  10. /dev/shm 引起的内存统计问题

    最近,有个同事问我,怎么准确地描述linux系统到底还有多少内存可供我使用.这里不扯内存碎片问题,就说剩余总量. 如下: cat /proc/meminfo MemTotal: 263796812 k ...