随笔分类 - PHP
PHP 创建二叉树镜像(交换左右子树)
摘要:1 <?php 2 #生成二叉树镜像(交换树的所有左右节点) 3 4 class Node { 5 public $data = null; 6 public $parent = null; 7 public $left = null; 8 public $right = null; 9 }10 11 #递归方法12 function mirror_recursive($root) {13 if ($root === null) {14 retur...
阅读全文
PHP 查找链表倒数第i个节点
摘要:1 <?php 2 #查找链表倒数第i个节点,倒数第0个为最后一个节点 3 class Node { 4 public $data = null; 5 public $next = null; 6 } 7 8 #第一种方法,先算出链表总长,然后向后寻找n-i个节点 9 function last_i($head, $i) {10 $cnode = $head;11 $n = 0;12 while ($cnode != null) {13 $n++;...
阅读全文
PHP 不用求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
摘要:1 <?php 2 class Sum0 { 3 public function sum() { 4 return 0; 5 } 6 } 7 8 class Test { 9 private $a = array();10 11 public function __construct() {12 $this->a[0] = new Sum0();13 $this->a[1] = $this;14 ...
阅读全文
PHP 不用加减乘除做加法
摘要:1 <?php 2 #不用加减乘除做加法 3 #思路:使用位运算实现 4 #先算出二者不进位的相加结果,xor实现 5 #再算出二者的进位结果,位与和位移实现 6 #最后把两个结果相加 7 8 function cplus($num1, $num2) { 9 if ($num2 == 0) {10 return $num1;11 }12 13 $sum = $num1 ^ $num2;14 $carry = ($num1 & $num2) << 1;15 ...
阅读全文
PHP 计算二叉树距离最长的两个节点间的距离
摘要:1 <?php 2 #查找二叉树距离最长的两个节点的距离,即相距边数最多的两个节点的边数 3 #解题思路:距离最长的两个节点有以下3中情况 4 #1.两个节点一个位于左子树,一个位于右子树,则最长距离是左右子树的深度相加 5 #2.两个节点都位于左子树,则最长距离是以左子树为根节点的左子树的两个左右子树的深度相加 6 #3.两个节点都位于右子树,则最长距离是以右子树为根节点的右子树的两个左右子树的深度相加 7 8 class Node { 9 public $data = null;10 public $lef...
阅读全文
PHP 使用二叉树的先序和中序遍历结果构造二叉树
摘要:1 <?php 2 #树节点 3 class Node { 4 public $data = null; 5 public $parent = null; 6 public $left = null; 7 public $right = null; 8 } 9 10 #根据先序和中序遍历数组建立二叉树,注意是二叉树,不是二叉排序树,而且条件是树没有相同的值11 12 #思想是使用先序数组确定根节点,然后通过中序数组找到根节点的左右子树节点13 14 #@param pre 前序遍历...
阅读全文
PHP 通过数组判断数组顺序输出是否是二叉排序树的后序遍历结果
摘要:1 <?php 2 #通过数组判断该数组顺序输出是否是二叉树后序遍历结果 3 4 #@param a 待判断数组 5 #@param s 待判断开始部分 6 #@param e 待判断结束部分 7 function is_bst_post($a, $s, $e) { 8 if ($s == $e) { 9 return true;10 }11 12 #由于是后序遍历,所以根节点必然是最后一个元素13 $root = $a[$e];14 #找...
阅读全文
PHP a[n+1]共有n+1个数,数值范围是1~n,a中有1个数重复,其他各不相同,找出这个重复的数
摘要:1 <?php 2 #a[n+1]共有n+1个数,数值范围是1~n,a中有1个数重复,其他各不相同,找出这个相同的数 3 4 #第一种方法,利用 a数组的和减去1+2+3+...+n的和,得到的结果就是重复数字 5 function get_dup($a) { 6 $size = count($a); 7 $suma = 0; 8 $sumn = 0; 9 for ($i = 0; $i < $size; $i++) {10 $suma += $a[$i];11 ...
阅读全文
PHP 字符串匹配算法 Sunday算法
摘要:搜索文本 text = "my testing algorithm in test"模式 pattern = "test"Sunday算法的关键点在于1.设定一个匹配位移映射 shift[],这个shift[]映射关系必须按从左到右的顺序简历,例如pattern = "test",注意到此处有2个t,那么建立出来的位移映射是 shift[] = Array ( [t] => 1 [e] => 3 [s] => 2 ),而如果不是从左到右,是从右到左的建立映射,就会变成 shift[] = Array ( [t] =&
阅读全文
PHP 逆转字符串与逆转句子
摘要:1 <?php 2 #颠倒字符串 3 4 #将字符串从头和尾向中间遍历,交换位置 5 function cstrrev(&$str, $begin, $len) { 6 $i = $begin; 7 $j = $begin + $len - 1; 8 while ($i < $j) { 9 $temp = $str[$i];10 $str[$i] = $str[$j];11 $str[$j] = $temp;12 ...
阅读全文
PHP 逆转单链表
摘要:1 <?php 2 #逆转单链表 3 class Node { 4 public $data = null; 5 public $next = null; 6 } 7 8 #递归版本 9 #思想是一直递归到倒数第二个非空节点,并将其next->next指向自己,将自己的next指向null10 #为了获得逆转后的头结点,在最后一个非空节点,即cnode->next == null时,将节点返回11 function reverse_list_r($node) {12 if ($node-...
阅读全文
PHP 判断链表是否相交
摘要:解题思路:分三种情况1.两个链表都是无环链表,则使用指针p1,p2,分别遍历到两个链表尾,如果p1===p2,说明链表相交,否则不相交2.两个链表有一个有环,另一个无环,那么这种情况链表肯定不相交,因为如果其中一个有环,另一个和它相交,另一个也肯定会有环3.两个链表都有环,找到链表a和链表b的环中的两个节点p1,p2,用pa=p1,然后用pa=pa->next,直到pa===p1(意思是让pa在环内跑一圈),如果在跑的过程中发现pa === p2,说明两个链表的环是同一个,则相交,如果到达pa===p1,说明两个链表不相交下面是代码 1 <?php 2 #判断链表是否相交 3 ..
阅读全文
PHP 查找随即数组中的最小的k个数
摘要:1 <?php 2 #查找数组中最小的k个数 3 4 function swap(&$arr, $i, $j) { 5 $temp = $arr[$i]; 6 $arr[$i] = $arr[$j]; 7 $arr[$j] = $temp; 8 } 9 10 #第一种方法,使用选择排序直到排好序的部分元素个数为k,效率为O(kn) 11 function select_sort_k($arr, $k) { 12 if ($k >= count($arr)) {...
阅读全文
PHP 输入一棵二叉树和一个数字n,要求找出路径和为n的所有路径
摘要:1 <?php 2 #输入一棵二叉树和一个数字n,要求找出路径和为n的所有路径 3 4 class Node { 5 public $data = null; 6 public $parent = null; 7 public $left = null; 8 public $right = null; 9 }10 11 #使用数组构造完全二叉树12 function build_cbtree($a) {13 $root = new Node();14 $r...
阅读全文
PHP 将数组转换为完全二叉树
摘要:1 <?php 2 class Node { 3 public $data = null; 4 public $parent = null; 5 public $left = null; 6 public $right = null; 7 } 8 9 #使用数组构造完全二叉树10 function build_cbtree($a) {11 $root = new Node();12 $root->data = $a[0];13 14 for ($i...
阅读全文
PHP 定义栈结构,实现min函数,获取栈最小元素,要求时间复杂度为O(1)
摘要:1 <?php 2 #设计一个栈的数据结构,要求增加一个min函数,可以取出栈的最小元素 3 #要求push,pop,min的时间复杂度都是O(1) 4 #解题思路:在每个栈元素增加一个min变量,这个变量存储次元素及其之前所有元素的最小值 5 6 #栈节点 7 class Node { 8 public $data = null; 9 public $min = null;10 }11 12 class Min_Stack {13 private $data = array();14 ...
阅读全文
PHP 将二叉查找树转换为双向链表,要求不能创建新节点,只能调节节点指针
摘要:<?php #将二叉查找树转换为双向链表,要求不能创建新节点,只能调节节点指针 #解题思路是从树的底层开始,调整每个节点的左右子树,将左子树的最大节点与根节点相连,将又子树的最小节点与根节点相连 #我们把节点的left当做链表的pre指针,right当做链表的next指针 #直到所有子树以及根节点转换完成 #树节点 class Node { public $data = null; public $parent = null; public $left = null; public $right...
阅读全文
PHP 两个等长有序数组求合并后的中位数
摘要:算法思路:每次取两个数组的中位数进行比较,如图我们假定取的中位数是下中位数,即每次取中位数坐标时使用floor取出,当数组长度是奇数时,取得是正中间的元素,是偶数时取得就是下中位数1. a[n/2] == b[n/2],可知中位数即为a[n/2],返回即可2. a[n/2] < b[n/2],设a,b数组蓝色红色部分元素分别为a[b],a[r],b[b],b[r],可知 a[b] <= a[n/2] < b[n/2] <= b[b]于是有 a[b] <= a[r], a[b] < b[b] (数组元素可能存在重复)b[b] >= b[r] , b[b]
阅读全文
PHP 二叉树的深度优先与广度优先遍历
摘要:1 <?php 2 #二叉树的广度优先遍历 3 #使用一个队列实现 4 5 class Node { 6 public $data = null; 7 public $left = null; 8 public $right = null; 9 }10 11 #@param $btree 二叉树根节点12 function breadth_first_traverse($btree) {13 $traverse_data = array();14 ...
阅读全文
PHP 查找有序数组中和为n的数对
摘要:1 <?php 2 #查找有序数组中和为n的数对 3 #思路是从数组两边开始找,当a[h] + a[t] == n,返回数对 4 #当a[h] + a[t] < n, h++ 5 #当a[h] + a[t] > n, t-- 6 7 function search_n($a, $n) { 8 $h = 0; 9 $t = count($a) - 1;10 $pairs = array();11 12 while ($h < $t) {13 $sum = $a[$h...
阅读全文