php剑指机器人范围,剑指offer试题(PHP篇三)

function VerifySquenceOfBST($sequence)

{

// write code here

$size = count($sequence);

if($size == 0){

return false;

}

$i = 0;

while($size--){

while($sequence[$i++]

while($sequence[$i++]>$sequence[$size]);

if($i

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

/*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

/*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

/*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

$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

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

$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

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

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

function FindGreatestSumOfSubArray($array)

{

// write code here

$count = count($array);

$max = $array[0];

for($i=0;$i

$sum = 0;

for($j=$i;$j

$sum+=$array[$j];

if($sum>$max){

$max = $sum;

}

}

}

return $max;

}

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

思路:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值