劍指offer試題(PHP篇二)

11.二進制中1的個數php

題目描述

輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼錶示。
時間限制:1秒   空間限制:32768K
<?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   佔用內存:2316knode

感悟:算法

  說實話,這類題是個人弱項,想了大半天,無從下手,後來仍是在上網搜了些資料後,才勉強解出。首先判斷n是否是負數,當n爲負數的時候,直接用後面的循環會致使死循環,由於負數向左移位的話最高位補1! 所以須要一點點特殊操做,能夠將最高位的符號位1變成0,也就是n & 0x7FFFFFFF,這樣就把負數轉化成正數了,惟一差異就是最高位由1變成0,由於少了一個1,因此count加1。以後再按照while循環裏處理正數的方法來操做就能夠完美解決。
 
 
12.數值的整數次方

題目描述

給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。
時間限制:1秒   空間限制:32768K
<?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;
         
    }
   
}

其實也不是很難啦= =。this

 

13.調整數組順序使奇數位於偶數前面spa

題目描述

輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得全部的奇數位於數組的前半部分,全部的偶數位於位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
時間限制:1秒   空間限制:32768K
<?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   佔用內存:2432kcode

感悟:blog

  這道題不算難,算法思路:建立兩個臨時數組,經過對原數組的每一個值進行判斷,奇偶分別存入兩個臨時數組中,再將偶數組放入奇數組以後便可。

 

14.鏈表中倒數第k個結點

題目描述

輸入一個鏈表,輸出該鏈表中倒數第k個結點。
時間限制:1秒   空間限制:32768K
<?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.反轉鏈表

題目描述

輸入一個鏈表,反轉鏈表後,輸出鏈表的全部元素。
時間限制:1秒   空間限制:32768K
<?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.合併兩個排序的鏈表

題目描述

輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,固然咱們須要合成後的鏈表知足單調不減規則。
時間限制: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變量,進棧出棧,返回棧頂元素,求棧中最小元素,按照通常思路求解便可。

 

 

 注:以上均爲我的理解,若有錯誤,請提出,必改正。

相關文章
相關標籤/搜索