
剑指OFFER-PHP实现
剑指offer是每个走向职场的程序员必刷的一本优秀的题目,使用php将里面的问题解决了一遍,给广大的php战友们参考。
重口味码农
本博客用于记录自己学习中遇到的疑惑和记录,希望能和大家多多交流。
展开
-
剑指offer-和为s的数列
题目 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述: 输出所有和为S的连续原创 2017-08-23 19:57:17 · 946 阅读 · 9 评论 -
剑指offer-字符串左移
题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!题解 有几种解法。主要是使用substr函数。可以看出最终字符串分为两个部分,把这两部分拼接起来原创 2017-08-23 20:06:23 · 709 阅读 · 0 评论 -
剑指offer-判断平衡二叉树
题目 输入一棵二叉树,判断该二叉树是否是平衡二叉树。题解 两个比较重要的部分:首先左右子树相差不大于1。然后所有子树都要为平衡二叉树。代码<?php/*class TreeNode{ var $val; var $left = NULL; var $right = NULL; function __construct($val){ $thi原创 2017-08-23 21:03:10 · 780 阅读 · 0 评论 -
剑指offer-二叉树的下一个节点
题目 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。题解 分为三种情况: 1、pNode有右子树时,则下一个应该是pNode的右子树的最左节点。 2、pNode没有右子树,且pNode为它的父节点的左子树,则它的下一个节点为PNode的父节点。 3、pNode没有右子数,且pNode为原创 2017-08-23 21:10:07 · 422 阅读 · 0 评论 -
剑指offer-判断二叉树是否对称
题目 请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。题解 递归判断二叉树两侧。代码<?php/*class TreeNode{ var $val; var $left = NULL; var $right = NULL; function __construct($val){原创 2017-08-23 21:18:08 · 572 阅读 · 0 评论 -
剑指offer-字符流中第一个不重复的字符
题目> 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符题解 使用索引数组代码<?phpglobal $result;//Init module if you n原创 2017-08-23 21:25:40 · 517 阅读 · 0 评论 -
剑指offer-统计一个数字在排序数组中出现的次数-PHP
题目 统计一个数字在排序数组中出现的次数。题解 1、既然是排序数组,使用二分查找是效率最高的。找到之后再向两侧拓展一下。代码<?phpfunction GetNumberOfK($data, $k){ if(count($data)==0){ return 0; } $index = 0; $low = 0; $high = co原创 2017-08-22 22:01:53 · 1264 阅读 · 0 评论 -
剑指offer-连续子数组的最大和
题目 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至原创 2017-08-22 22:02:56 · 1038 阅读 · 0 评论 -
PHP实现非递归先序、中序、后序遍历二叉树
先序遍历:利用栈先进后出的特性,先访问根节点,再把右子树压入,再压入左子树。这样取出的时候是先取出左子树,最后取出右子树。function preorder($root){ $stack = array(); array_push($stack, $root); while(!empty($stack)){ $center_node = array_pop原创 2017-04-22 11:02:45 · 1635 阅读 · 2 评论 -
剑指OFFER-二叉树中和为某一值的路径
题目 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。题解 递归遍历二叉树代码/*递归版本*//*class TreeNode{ var $val; var $left = NULL; var $right = NULL; function __construct(原创 2017-08-14 11:46:08 · 384 阅读 · 0 评论 -
剑指OFFER-二进制中1的个数
题目 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。题解 这是个位运算的题目。 解法一:可以通过按位与操作,通过将每一位和1与操作来求出1的个数。 解法二(最优解):一个巧妙的方法,一个不为0的二进制数,肯定至少有一位是1,当这个数减一的时候,它的最后一位1会变为0,后边的所有0会变为1。比如10100,减一之后会变为10011,然后用原数字10100和100原创 2017-08-22 16:23:31 · 525 阅读 · 0 评论 -
剑指offer-用两个栈实现队列
题目 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。题解 初始化两个栈。 push:压入栈1. pop:栈2不为空时,栈2出栈,栈2为空时,将栈1元素全部出栈压入栈2,栈2出栈。代码<?php$arr1 = array();$arr2 = array(); function mypush($node) {原创 2017-08-22 19:38:21 · 695 阅读 · 0 评论 -
剑指offer-包含min函数的栈
题目 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。题解 四个功能: push pop top:栈顶元素 min:找出最小的元素代码<?php$arr = array();function mypush($node){ // write code here global $arr; array_push($arr,原创 2017-08-22 21:52:19 · 860 阅读 · 0 评论 -
剑指OFFER-二维数组中的查找
题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。题解 最笨的办法当然是按照顺序挨个搜索,如果数组无序的话,这也是唯一的办法,不过既然数组有序,就可以简单很多,一是可以通过每列的二分查找的方式搜索。不过更简单的是因为数组排列从左到右递增,从上到下递增。那每一列最左边的数原创 2017-03-19 15:54:06 · 2318 阅读 · 0 评论 -
剑指OFFER-替换空格
题目 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。**题解 用str_replace函数试了一下,竟然能通过,看来效率还是很高的。 然后考虑解题思路,很明显这是要替换字符串,所以要考虑的是移动原有的字符串还是新建一个字符串。为了降低空间复杂度,一般会选择在原来字符串基础上进行原创 2017-03-19 16:25:00 · 2114 阅读 · 0 评论 -
剑指OFFER-合并两个排序的链表-PHP
题目 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。题解 简单的合并排序。由于两个数列本来就是递增的,所以每次将两个数列中较小的部分拿过来就可以了。代码<?php/*class ListNode{ var $val; var $next = NULL; function __construct($x){原创 2017-03-20 19:19:36 · 2508 阅读 · 0 评论 -
剑指offer-链表中倒数第K个节点-php
题目 输入一个链表,输出该链表中倒数第k个结点。题解 注意这个题目是返回节点,而不是返回值。返回值的话可以用栈来存储。返回节点则不能这样做。 设置两个指针,先让第一个指针移动k-1次。然后两个指针同时移动,当第一个指针到达最后一个节点,第二个指针就在倒数第k个节点。 注意边界:K长度可能超出链表长度,所以当第一个指针的next为空时,返回null代码<?php/*class原创 2017-03-20 20:02:43 · 2477 阅读 · 0 评论 -
剑指offer-栈的压入、弹出序列-php
题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)题解 平时也会遇到这种题目,解决思路和我们平时想的是一样的。就是一个一个地入栈,当栈顶元原创 2017-03-22 20:51:04 · 2192 阅读 · 0 评论 -
剑指offer-从上往下打印二叉树-php
题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印。题解 每层树从左到右打印,所以需要将节点的左右子树存起来,因为先进先出,所以用队列。代码/*class TreeNode{ var $val; var $left = NULL; var $right = NULL; function __construct($val){ $thi原创 2017-03-23 23:11:44 · 2333 阅读 · 0 评论 -
剑指offer-二叉树的深度-php
题目 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。题解 两种方法,一种是递归,深度优先遍历二叉树。另一种是非递归,就是层次遍历二叉树的方法,加上计算深度。代码<?php/*class TreeNode{ var $val; var $left = NULL; var $right = NU原创 2017-03-23 23:55:06 · 2849 阅读 · 0 评论 -
剑指offer-二叉树的镜像-php
题目 操作给定的二叉树,将其变换为源二叉树的镜像。 题解 翻转二叉树,有递归和非递归两种方式,非递归就是使用队列。代码<?php/*class TreeNode{ var $val; var $left = NULL; var $right = NULL; function __construct($val){ $this->val = $原创 2017-03-24 15:08:09 · 2490 阅读 · 0 评论 -
剑指offer-顺时针打印矩阵-php
题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.题解 就是一圈一圈地打印,只要控制好循环就可以。代码<?phpfunction printMatrix($matrix){原创 2017-04-01 12:43:09 · 1367 阅读 · 0 评论 -
剑指向offer-树的子结构-php
题目 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)题解 需要两个函数,一个用来判断A树是否包含B树。另一个判断A树和B树相同。代码<?php/*class TreeNode{ var $val; var $left = NULL; var $right = NULL; function __construct(原创 2017-04-04 16:00:41 · 487 阅读 · 0 评论 -
剑指offer-重建二叉树-php
题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。题解 利用前序遍历和中序遍历的性质来解决这个问题。 首先前序遍历的第一个节点是树的根节点root,在中序遍历中找到这个root,则root前面就原创 2017-04-04 16:43:38 · 1417 阅读 · 0 评论 -
剑指offer-调整数组顺序使奇数位于偶数前面
题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。题解 两个数组,一个存奇数,一个存偶数代码<?phpfunction reOrderArray($array){ $array_a = array(); $array_b = array();原创 2017-04-09 19:33:01 · 435 阅读 · 0 评论 -
剑指offer-数值的整数次方-php
题目 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。题解> >代码<?phpfunction Power($base, $exponent){ if($exponent < 0) { if($base === 0) { return false; }else {原创 2017-04-09 20:14:46 · 659 阅读 · 0 评论 -
剑指offer-数组中出现次数超过一半的数字-php
题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。题解如果某个数字超过数组长度一半,那成对去掉数字之后,剩下的那个就是目标数字。代码“`原创 2017-04-10 17:43:10 · 581 阅读 · 0 评论 -
剑指offer-最小的K个数-php
题目 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。题解 先排序,再剪切代码<?phpfunction GetLeastNumbers_Solution($input, $k){ $len = count($input); if($k > $len) return [];原创 2017-04-10 19:04:38 · 564 阅读 · 0 评论 -
剑指offer-第一个只出现一次的字符-php
题目 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置。如果字符串为空,返回-1题解 用一个数组标记。。。代码“`PHP function FirstNotRepeatingChar(str){str){ len = strlen(str);if(str); if(len == 0) re原创 2017-04-10 19:44:28 · 753 阅读 · 0 评论 -
剑指offer-把二叉树打印成多行-php
题目 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。题解 利用队列先进先出的特点就可以完成。代码<?php/*class TreeNode{ var $val; var $left = NULL; var $right = NULL; function __construct($val){ $this->val = $va原创 2017-04-10 20:17:59 · 569 阅读 · 0 评论 -
剑指offer-按之字形顺序打印二叉树-php
题目 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。题解 使用两个栈代码<?php/*class TreeNode{ var $val; var $left = NULL; var $right = NULL; function __construct($va原创 2017-04-10 20:24:48 · 433 阅读 · 0 评论 -
剑指offer-链表中环的入口节点-php
题目 一个链表中包含环,请找出该链表的环的入口结点。题解 第一步,找环中相汇点。分别用p1,p2指向链表头部,p1每次走一步,p2每次走二步,直到p1==p2找到在环中的相汇点。 第二步,找环的入口。接上步,当p1==p2时,p2所经过节点数为2x,p1所经过节点数为x,设环中有n个节点,p2比p1多走一圈有2x=n+x; n=x;可以看出p1实际走了一个环的步数,再让p2指向链表头原创 2017-04-10 22:57:46 · 583 阅读 · 0 评论 -
剑指offer-构建乘积数组-php
题目 给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…A[i-1]*A[i+1]…*A[n-1]。不能使用除法。题解 看一张图片搞懂这个问题。 每个B[i]就是每一行的乘积,所以可以先计算下三角,然后计算上三角。就可以求出全部。代码<?phpfunction multiply($numbers){原创 2017-04-11 15:57:54 · 614 阅读 · 0 评论 -
剑指offer-反转链表-php
题目 输入一个链表,反转链表后,输出链表的所有元素。题解 上图。 先保存下一个节点,再让这个节点下一个指向上一个。然后依次遍历后边的。代码<?php/*class ListNode{ var $val; var $next = NULL; function __construct($x){ $this->val = $x; }}*原创 2017-04-11 16:34:05 · 1733 阅读 · 0 评论 -
剑指offer-从尾到头打印链表-php
题目 输入一个链表,从尾到头打印链表每个节点的值。题解 一种是使用栈。 第二种是递归。代码//递归版本function printListFromTailToHead($head){ if($head == NULL){ return []; } $arr = array(); $cur = $head; if($cur->n原创 2017-04-11 16:53:35 · 1124 阅读 · 0 评论 -
剑指offer-用两个栈实现队列-php
题目 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。题解 两个栈。出栈的时候,如果栈2不为空,就出栈2。如果栈2为空,就把栈1的出栈再入栈2。代码<?php$arr1 = array();$arr2 = array(); function mypush($node) { array_push($arr1,$node);原创 2017-04-11 17:09:19 · 1817 阅读 · 0 评论