剑指offer试题(PHP篇二)
11.二进制中1的个数
题目描述
<?php function NumberOf1($n)
{
// write code here
$count = 0;
if($n<0){
$n=$n & 0X7FFFFFFF;
$count++;
}
while($n){
$n=($n-1)&$n;
$count++;
}
return $count;
}
运行时间:11ms 占用内存:2316k
感悟:
说实话,这类题是我的弱项,想了大半天,无从下手,后来还是在上网搜了些资料后,才勉强解出。首先判断n是不是负数,当n为负数的时候,直接用后面的循环会导致死循环,因为负数向左移位的话最高位补1! 因此需要一点点特殊操作,可以将最高位的符号位1变成0,也就是n & 0x7FFFFFFF,这样就把负数转化成正数了,唯一差别就是最高位由1变成0,因为少了一个1,所以count加1。之后再按照while循环里处理正数的方法来操作就可以完美解决。
题目描述
<?php function Power($base, $exponent)
{
// write code here
return pow($base,$exponent);
}
运行时间:15ms 占用内存:2432k
感悟:
这题用php做和作弊一样。。。呃,当然,身为一个正直的人,还是要把用算法思路写的解贴出来。
<?php function Power($base, $exponent)
{ if($exponent >= 0){
$res = 1;
while($exponent >= 1){
$res = $res * $base;
$exponent--;
}
return $res;
}
if($exponent < 0){
$exponent2 = abs($exponent);
$res = 1;
while($exponent2 >=1){
$res = $res *$base;
$exponent2--;
}
return 1/$res; } }
其实也不是很难啦= =。
13.调整数组顺序使奇数位于偶数前面
题目描述
<?php function reOrderArray($array)
{
// write code here
$tmp1 = [];
$tmp2 = [];
for($i=0;$i<count($array);$i++){
if($array[$i]%2){
$tmp1[] = $array[$i];
}else{
$tmp2[] = $array[$i];
}
}
for($j=0;$j<count($tmp2);$j++){
$tmp1[]=$tmp2[$j];
}
return $tmp1;
}
运行时间:10ms 占用内存:2432k
感悟:
这道题不算难,算法思路:创建两个临时数组,通过对原数组的每个值进行判断,奇偶分别存入两个临时数组中,再将偶数组放入奇数组之后即可。
14.链表中倒数第k个结点
题目描述
<?php
/*class ListNode{
var $val;
var $next = NULL;
function __construct($x){
$this->val = $x;
}
}*/
function FindKthToTail($head, $k)
{
// write code here
$tmp=$head;
$len=0;
while($head!=null){
$len++;
$head=$head->next;
}
if($k>$len){
return null;
}
for($i=0;$i<$len-$k;$i++){
$tmp=$tmp->next;
}
return $tmp;
}
运行时间:25ms 占用内存:2316k
感悟:
这道题的思路非常清晰,即首先求出链表长度,判断k结点是否超出链表长度,若符合要求,则通过循环找到第k个结点并返回。
15.反转链表
题目描述
<?php
/*class ListNode{
var $val;
var $next = NULL;
function __construct($x){
$this->val = $x;
}
}*/
function ReverseList($pHead)
{
// write code here
if($pHead==null){
return null;
}
$pre=null;
while($pHead != null){
$tmp = $pHead->next;
$pHead->next = $pre;
$pre = $pHead;
$pHead = $tmp;
}
return $pre;
}
运行时间:9ms 占用内存:3724k
感悟:
这道链表题自我感觉还是有点点绕的(个人大脑不是很发达。。。),思路,简单来说就是不断的取出原链表的头,然后存入pre的尾部,这样做的结果就是将整个链表反转。
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 - 九度1503 - 二叉搜索树与双向链表
剑指Offer - 九度1503 - 二叉搜索树与双向链表2014-02-05 23:39 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树 ...
- 剑指Offer - 九度1513 - 二进制中1的个数
剑指Offer - 九度1513 - 二进制中1的个数2013-11-29 23:35 题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. ...
- 剑指Offer - 九度1384 - 二维数组中的查找
剑指Offer - 九度1384 - 二维数组中的查找2013-11-23 23:23 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...
- 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列
剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...
- 剑指Offer(三十二):把数组排成最小的数
剑指Offer(三十二):把数组排成最小的数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...
- 剑指offer【01】- 二维数组中的查找(Java)
在经历了春招各大公司的笔试题和面试官的血虐之后,决定要刷一些算法题了,不然连面试机会都没有. 而应对笔试和面试,比较出名的就是剑指offer的题目和LeetCode的题目了.剑指offer应对面试中的 ...
- 剑指Offer编程题1——二维数组中的查找
剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...
- 剑指offer(1)二维数组的查找
限制今天起开始也刷剑指offer啦,一步一步来. 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数, ...
- 【剑指offer】二分查找二维数组
1 2 3 4 5 6 7 8 9 3 3 1 2 3 4 5 6 7 8 9 10 3 3 12 2 3 4 5 6 7 8 9 10 例子输出: Yes No No 时间限制:1 秒 内存限制:3 ...
- 剑指 offer 第一题: 二维数组中的查找
打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣
随机推荐
- Eclipse安装JD-Eclipse反编译插件成功看源码
Eclipse安装JD-Eclipse反编译插件 转载 2017年12月24日 15:19:27 http://heavengate.blog.163.com/blog/static/202381 ...
- HTTP的请求方法OPTIONS
HTTP请求方法并不是只有GET和POST,只是最常用的.据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS.GET.HEAD.POST.PUT.DELETE.TR ...
- [转]解决error: "net.ipv4.netfilter.ip_conntrack_max" is an unknown key错误
今天在新买的vps上执行sysctl -p,报下面的错误:net.ipv4.ip_forward = 0net.ipv4.conf.default.rp_filter = 1net.ipv4.conf ...
- linux_磁盘分区
分区并没有数据内容只是改变分区表,保存在0磁头,0磁道1扇区除MBR引导后64bytes中,只能有4个组分区,4个以上要一个扩展分区 引导MBR,保存在446字节中 磁盘想要存放数据,首先要分区,可以 ...
- relative 和 absolute 定位关系
问题: relative 和 absolute 之间的关系是什么?有什么区别? 那,答案呢? relative 相对定位, 以自己没有设置relative 属性之前的位置来定位,占用没有设置rela ...
- common-logging源码解析
OK,现在我们来研究下common-logging的源码.这篇博客有参照上善若水的博客,感谢他的无私分享. 先来随便扯点吧,貌似所有这些流行的Logging框架都和Log4J多少有点关系(不太确定Co ...
- linkin大话设计模式--策略模式
linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi] 策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...
- linux tar 压缩解压命令
tar命令: -c 压缩-x 解压缩-t 不解压的情况下查看文件内容-r 向压缩文件追加文件-u 更新压缩文件 以上参数必须和'-f'参数连用,且'-f'必须为最后一个参数,后接文档名 -z 对应gz ...
- PHP操作Memcached的方法汇总
memcached非关系型数据库安装.php中的memcache的扩展安装.以及php中的memcached的扩展安装可以参考: http://www.cnblogs.com/phpstudy2015 ...
- flask----flask-session
一.flask-session flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方 ...