11.二進制中1的個數php
<?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循環裏處理正數的方法來操做就能夠完美解決。<?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
<?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個結點
<?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變量,進棧出棧,返回棧頂元素,求棧中最小元素,按照通常思路求解便可。
注:以上均爲我的理解,若有錯誤,請提出,必改正。