1. 程式人生 > 實用技巧 >LeetCode 部分題解 PHP 版

LeetCode 部分題解 PHP 版

LeetCode 部分題解 PHP 版

53. 最大子序和

function maxSubArray($nums) {
$ans = $nums[0];
$sum = 0;
foreach ($nums as $num) {
if ($sum > 0) {
$sum += $num;
} else {
$sum = $num;
}
$ans = max($ans, $sum);
}
return $ans;
}

13. 羅馬數字轉整數

function romanToInt($s) {
$romanMap = ['I' => 1, 'V' => 5, 'X' => 10, 'L' => 50, 'C' => 100, 'D' => 500, 'M' => 1000, 'IV' => 4, 'IX' => 9, 'XL' => 40, 'XC' => 90, 'CD' => 400, 'CM' => 900];
$ans = 0;
for ($i = 0; $i < strlen($s); ++ $i) {
if ($i < strlen($s) - 1 and array_key_exists(substr($s, $i, 2), $romanMap)) {
$ans += $romanMap[substr($s, $i, 2)];
++ $i;
} else {
$ans += $romanMap[$s[$i]];
}
}
return $ans;
}

14. 最長公共字首

function longestCommonPrefix($strs) {
$ans = "";
for($i = 0; $i < strlen($strs[0]); ++$i) {
for ($j = 1; $j < count($strs); ++ $j) {
if ($strs[0][$i] != $strs[$j][$i])
return $ans;
}
$ans .= $strs[0][$i];
}
return $ans;
}

20. 有效的括號

function isValid($s) {
while (strpos($s, "[]") !== false or strpos($s, "()") !== false or strpos($s, "{}") !== false) {
$s = str_replace("[]", "", $s);
$s = str_replace("{}", "", $s);
$s = str_replace("()", "", $s);
}
return $s == "" ? true: false;
}

28. 實現 strStr()

function strStr1($haystack, $needle) {
if (empty($needle)) return 0;
$ans = strpos($haystack, $needle);
return $ans !== false ? $ans : -1;
}

38. 報數

function countAndSay($n) {
$ans[1] = "1";
for ($i = 2; $i <= $n; ++ $i) {
$ans[$i] = "";
for ($j = 0; $j < strlen($ans[$i - 1]); ) {
$k = 0;
while ($j + $k < strlen($ans[$i - 1]) and $ans[$i - 1][$j] == $ans[$i - 1][$j + $k]) {
++ $k;
}
$ans[$i] .= $k."".$ans[$i - 1][$j];
$j += $k;
}
}
return $ans[$n];
}

58. 最後一個單詞的長度

function lengthOfLastWord($s) {
$s = trim($s);
$s = explode(" ", $s);
return strlen($s[count($s) - 1]);
}

67. 二進位制求和

function addBinary($a, $b) {
$t = 0;
$ans = '';
$a = strrev($a);
$b = strrev($b);
for ($i = 0; $i < max(strlen($a), strlen($b)); ++ $i) {
$t += ($i < strlen($a) ? $a[$i] : 0) + ($i < strlen($b) ? $b[$i] : 0);
$ans .= $t % 2;
$t = intval($t / 2);
}
while ($t) {
$ans .= $t % 2;
$t = intval($t / 2);
}
return strrev($ans);
}

69. x 的平方根

function mySqrt($x) {
return (int)sqrt($x);
}

70. 爬樓梯

function climbStairs($n) {
$a[1] = 1;
$a[2] = 2;
if ($n == 1 || $n == 2) {
return $n;
}
for ($i = 3; $i <= $n; ++ $i) {
$a[$i] = $a[$i - 1] + $a[$i - 2];
}
return $a[$n];
}

88. 合併兩個有序陣列

function merge($nums1, $m, $nums2, $n) {
$nums1 = array_merge(array_slice($nums1, 0, $m), array_slice($nums2, 0, $n));
sort($nums1);
return $nums1;
}

118. 楊輝三角

function generate($numRows) {
$ans = array();
for ($i = 0; $i < $numRows; ++$i) {
$ans[$i][0] = 1;
for ($j = 1; $j < $i; ++ $j) {
$ans[$i][$j] = $ans[$i - 1][$j - 1] + $ans[$i - 1][$j];
}
$ans[$i][$i] = 1;
}
return $ans;
}

119. 楊輝三角 II

function getRow($rowIndex) {
$ans = array();
for ($i = 0; $i < $rowIndex + 1; ++$i) {
$ans[$i][0] = 1;
for ($j = 1; $j < $i; ++ $j) {
$ans[$i][$j] = $ans[$i - 1][$j - 1] + $ans[$i - 1][$j];
}
$ans[$i][$i] = 1;
}
return $ans[$rowIndex];
}

121. 買賣股票的最佳時機

function maxProfit($prices) {
$ans = 0;
$min = $prices[0];
for ($i = 0; $i < count($prices); ++ $i) {
$ans = max($ans, $prices[$i] - $min);
$min = min($min, $prices[$i]);
}
return $ans;
}

122. 買賣股票的最佳時機 II

function maxProfit($prices) {
$ans = 0;
for ($i = 0; $i < count($prices) - 1; ++ $i) {
$ans += $prices[$i] < $prices[$i + 1] ? ($prices[$i + 1] - $prices[$i]) : 0;
}
return $ans;
}

125. 驗證迴文串

function isPalindrome($s) {
$s = strtolower($s);
$ans = '';
for ($i = 0; $i < strlen($s); ++ $i) {
if (is_numeric($s[$i]) || (strcmp($s[$i], 'a') >= 0 && strcmp('z', $s[$i]) >= 0)) {
$ans .= $s[$i];
}
}
return $ans == strrev($ans);
}

136. 只出現一次的數字

function singleNumber($nums) {
$ans = 0;
foreach ($nums as $num) {
$ans ^= $num;
}
return $ans;
}

167. 兩數之和 II - 輸入有序陣列

function twoSum($numbers, $target) {
$begin = 0;
$end = count($numbers) - 1;
while ($begin < $end) {
if ($numbers[$begin] + $numbers[$end] == $target) return array($begin + 1, $end + 1);
if ($numbers[$begin] + $numbers[$end] > $target) -- $end;
else ++ $begin;
}
}

168. Excel表列名稱

function convertToTitle($n) {
$ans = '';
while ($n) {
$n --;
$ans .= chr(65 + intval($n % 26));
$n = intval($n / 26);
}
return strrev($ans);
}

169. 多數元素

function majorityElement($nums) {
$ans = $nums[0];
$count = 1;
for ($i = 1; $i < count($nums); ++ $i) {
if ($ans != $nums[$i]) {
-- $count;
} else {
++ $count;
}
if ($count == 0) {
$ans = $nums[$i];
$count = 1;
}
}
return $ans;
}

171. Excel表列序號

function titleToNumber($s) {
$s = strrev($s);
$ans = 0;
for ($i = 0; $i < strlen($s); ++ $i) {
$ans += (ord($s[$i]) - 64) * (26 ** $i);
}
return $ans;
}

172. 階乘後的零

function trailingZeroes($n) {
$ans = 0;
while ($n >= 5) {
$ans += intval($n / 5);
$n = intval($n / 5);
}
return $ans;
}

189. 旋轉陣列

function rotate($nums, $k) {
if ($k == 0) return $nums;
if ($k > count($nums)) {
$k = $k % count($nums);
}
$temp = array_reverse($nums);
$temp1 = array_reverse(array_slice($temp, 0, $k));
$temp2 = array_reverse(array_slice($temp, $k));
$nums = array_merge($temp1, $temp2);
return $nums;
}

198. 打家劫舍

function rob($nums) {
$dp[-1] = 0;
$dp[-2] = 0;
for ($i = 0; $i < count($nums); ++ $i) {
$dp[$i] = max($dp[$i - 2] + $nums[$i], $dp[$i - 1]);
}
return $dp[count($nums) - 1];
}

202. 快樂數

function isHappy($n) {
$slow = $quick = $n;
do {
$sum = 0;
$tmp = $slow;
while ($tmp) {
$sum += ($tmp % 10) * ($tmp % 10);
$tmp = intval($tmp / 10);
}
$slow = $sum;

$sum = 0;
$tmp = $slow;
while ($tmp) {
$sum += ($tmp % 10) * ($tmp % 10);
$tmp = intval($tmp / 10);
}
$slow = $sum;

$sum = 0;
$tmp = $quick;
while ($tmp) {
$sum += ($tmp % 10) * ($tmp % 10);
$tmp = intval($tmp / 10);
}
$quick = $sum;
} while ($slow != $quick);
return $quick == 1;
}

204. 計數質數

function countPrimes($n) {
$res =0;
$prime = array();
for ($i = 2; $i < $n; ++ $i) {
if (!key_exists($i, $prime)) {
++ $res;
for ($j = $i; $j < $n; $j += $i) {
$prime[$j] = 1;
}
}
}
return $res;
}

205. 同構字串

function isIsomorphic($s, $t) {
$a_b = array();
$b_a = array();
for ($i = 0; $i < strlen($s); ++ $i) {
if (!key_exists($s[$i], $a_b)) {
$a_b[$s[$i]] = $t[$i];
}
if ($a_b[$s[$i]] != $t[$i]) {
return false;
}

if (!key_exists($t[$i], $b_a)) {
$b_a[$t[$i]] = $s[$i];
}
if ($b_a[$t[$i]] != $s[$i]) {
return false;
}
}
return true;
}

217. 存在重複元素

function containsDuplicate($nums) {
$my_set = array();
foreach ($nums as $num) {
if (key_exists($num, $my_set)) {
return true;
}
$my_set[$num] = 0;
}
return false;
}

219. 存在重複元素 II

function containsNearbyDuplicate($nums, $k) {
$my_hash = array();
for ($i = 0; $i < count($nums); ++ $i) {
if (!key_exists($nums[$i], $my_hash)) {
$my_hash[$nums[$i]] = $i;
} else {
if ($i - $my_hash[$nums[$i]] <= $k) {
return true;
}
$my_hash[$nums[$i]] = $i;
}
}
return false;
}

231. 2的冪

function isPowerOfTwo($n) {
if ($n <= 0) return false;
return ($n & ($n - 1)) == 0;
}

242. 有效的字母異位詞

function isAnagram($s, $t) {
$s_arr = array();
$t_arr = array();
if (strlen($s) != strlen($t)) {
return false;
}
for ($i = 0; $i < strlen($s); ++ $i) {
$s_arr[$i] = $s[$i];
$t_arr[$i] = $t[$i];
}
sort($s_arr);
sort($t_arr);
return $s_arr == $t_arr;
}

258. 各位相加

function addDigits($num) {
while (strlen($num) != 1) {
$sum = 0;
while ($num) {
$sum += $num % 10;
$num = intval($num / 10);
}
$num = $sum;
}
return $num;
}

263. 醜數

function isUgly($num) {
if ($num < 1) return false;
while ($num % 2 == 0) {
$num /= 2;
}
while ($num % 3 == 0) {
$num /= 3;
}
while ($num % 5 == 0) {
$num /= 5;
}
return $num == 1;
}

268. 缺失數字

function missingNumber($nums) {
$ans = 0;
for ($i = 0; $i < count($nums); ++ $i) {
$ans += $i;
$ans -= $nums[$i];
}
return $ans + count($nums);
}

283. 移動零

function moveZeroes(&$nums) {
for ($i = 0, $j = 0; $j < count($nums); ++ $i, ++ $j) {
if ($nums[$i] == 0) {
array_splice($nums, $i, 1);
array_push($nums, 0);
-- $i;
}
}
return $nums;
}

290. 單詞規律

function wordPattern($pattern, $str) {
$str_arr = explode(" ", $str);
if (strlen($pattern) != count($str_arr)) return false;
$arr = array();
for ($i = 0; $i < strlen($pattern); ++ $i) {
if (!key_exists($pattern[$i], $arr)) {
$arr[$pattern[$i]] = $str_arr[$i];
}
if ($arr[$pattern[$i]] != $str_arr[$i]) {
return false;
}
}
$arr_unique = array_unique($arr);
return count($arr) == count($arr_unique) ? true: false;
}

292. Nim 遊戲

function canWinNim($n) {
return $n % 4 == 0 ? false: true;
}

299. 猜數字遊戲

function getHint($secret, $guess) {
$num_A = $num_B = 0;
$secret_arr = $guess_arr = array();
for ($i = 0; $i < strlen($secret); ++ $i) {
if ($secret[$i] == $guess[$i]) {
++ $num_A;
} else {
// secret
if (!key_exists($secret[$i], $secret_arr)){
$secret_arr[$secret[$i]] = 1;
} else {
$secret_arr[$secret[$i]] ++;
}

// guess
if (!key_exists($guess[$i], $guess_arr)){
$guess_arr[$guess[$i]] = 1;
} else {
$guess_arr[$guess[$i]] ++;
}
}
}
for ($i = 0; $i < 10; ++ $i) {
if (!key_exists($i, $secret_arr) or !key_exists($i, $guess_arr)) {
continue;
}
$num_B += min($guess_arr[$i], $secret_arr[$i]);
}
return $num_A."A".$num_B."B";
}

326. 3的冪

function isPowerOfThree($n) {
$pow_3 = [1,3,9,27,81,243,729,2187,6561,19683,59049,177147,531441, 1594323, 4782969, 14348907, 43046721, 129140163, 387420489, 1162261467];
return array_search($n, $pow_3) === false ? false: true;
}

342. 4的冪

function isPowerOfFour($num) {
if ($num <= 0) return false;
if ($num & ($num - 1) != 0) return false;
return boolval($num & 0x55555555);
}

344. 反轉字串

function reverseString(&$s) {
for ($begin = 0, $end = count($s) - 1; $begin < $end; ++ $begin, -- $end) {
list($s[$begin], $s[$end]) = array($s[$end], $s[$begin]);
}
return $s;
}

345. 反轉字串中的母音字母

function reverseVowels($s) {
$vowel = array('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U');
for ($begin = 0, $end = strlen($s) - 1; $begin < $end;) {
if (array_search($s[$begin], $vowel) === false) {
++ $begin;
continue;
}
if (array_search($s[$end], $vowel) === false) {
-- $end;
continue;
}
list($s[$begin], $s[$end]) = array($s[$end], $s[$begin]);
++ $begin;
--$end;
}
return $s;
}

349. 兩個陣列的交集

function intersection($nums1, $nums2) {
$ans = array();
for ($i = 0; $i < count($nums1); ++ $i) {
if (array_search($nums1[$i], $nums2) !== false) {
array_push($ans, $nums1[$i]);
}
}
return array_unique($ans);
}

350. 兩個陣列的交集 II

function intersect($nums1, $nums2) {
$ans = array();
for ($i = 0; $i < count($nums1); ++ $i) {
$offset = array_search($nums1[$i], $nums2);
if ($offset !== false) {
array_splice($nums2, $offset, 1);
array_push($ans, $nums1[$i]);
}
}
return $ans;
}

367. 有效的完全平方數

function isPerfectSquare($num) {
return sqrt($num) == intval(sqrt($num)) ? true : false;
}

371. 兩整數之和

function getSum($a, $b) {
return $a + $b;
}

383. 贖金信

function canConstruct($ransomNote, $magazine) {
for ($i = 0; $i < strlen($ransomNote); ++ $i) {
$offset = strpos($magazine, $ransomNote[$i]);
if ($offset === false) return false;
$magazine[$offset] = "趙";
}
return true;
}

387. 字串中的第一個唯一字元

function firstUniqChar($s) {
$word_num = array();
for ($i = 0; $i < strlen($s); ++ $i) {
if (!key_exists($s[$i], $word_num)) {
$word_num[$s[$i]] = 1;
} else {
++ $word_num[$s[$i]];
}
}
for ($i = 0; $i < strlen($s); ++ $i) {
if ($word_num[$s[$i]] == 1) return $i;
}
return -1;
}

389. 找不同

function findTheDifference($s, $t) {
$s_arr = $t_arr = array();
for ($i = 0; $i < strlen($s); ++ $i) {
$s_arr[$i] = $s[$i];
}
for ($i = 0; $i < strlen($t); ++ $i) {
$t_arr[$i] = $t[$i];
}
sort($s_arr);
sort($t_arr);
for ($i = 0; $i < count($s_arr); ++ $i) {
if ($s_arr[$i] != $t_arr[$i]) return $t_arr[$i];
}
return $t_arr[count($s_arr)];
}

392. 判斷子序列

function isSubsequence($s, $t) {
    $len = 0;
    if ($s == "") return true;
    for ($i = 0; $i < strlen($t); ++ $i) {
        if ($s[$len] == $t[$i]) ++ $len;
        if ($len == strlen($s)) return true;
    }
    return false;
}

401. 二進位制手錶

function readBinaryWatch($num) {
$ans = array();
for ($i = 0; $i < 12; ++ $i) {
for ($j = 0; $j < 60; ++ $j) {
if (substr_count(decbin($i), '1') + substr_count(decbin($j), '1') == $num){
array_push($ans, "$i:".sprintf("%02d", $j));
}
}
}
return $ans;
}

405. 數字轉換為十六進位制數

function toHex($num) {
if ($num < 0) return substr(dechex($num), 8, 8);
return dechex($num);
}

409. 最長迴文串

function longestPalindrome2($s) {
$ans = 0;
$tmp = array();
for ($i = 0; $i < strlen($s); ++ $i) {
if (key_exists($s[$i], $tmp)) {
$ans += 2;
unset($tmp[$s[$i]]);
} else {
$tmp[$s[$i]] = 1;
}
}
return $ans < strlen($s) ? $ans + 1: $ans;
}

412. Fizz Buzz

function fizzBuzz($n) {
$ans = array();
for ($i = 1; $i <= $n; ++ $i) {
if ($i % 3 == 0 and $i % 5 == 0) {
array_push($ans, "FizzBuzz");
} elseif ($i % 3 == 0) {
array_push($ans, "Fizz");
} elseif ($i % 5 == 0) {
array_push($ans, "Buzz");
} else {
array_push($ans, strval($i));
}
}
return $ans;
}

414. 第三大的數

function thirdMax($nums) {
$nums = array_unique($nums);
rsort($nums);
if (count($nums) < 3) {
return $nums[0];
}
return $nums[2];
}

415. 字串相加

function addStrings($num1, $num2) {
$ans = '';
$t = 0;
$num1 = strrev($num1);
$num2 = strrev($num2);
for ($i = 0; $i < max(strlen($num1), strlen($num2)) || $t != 0; ++ $i) {
if ($i >= strlen($num1)) {
$a1 = 0;
} else {
$a1 = $num1[$i];
}

if ($i >= strlen($num2)) {
$a2 = 0;
} else {
$a2 = $num2[$i];
}

$t = $a1 + $a2 + $t;
$ans .= $t % 10;
$t = intval($t / 10);
}
return strrev($ans);
}

434. 字串中的單詞數

function countSegments($s) {
$ans = 0;
$s = rtrim($s);
$s = ltrim($s);
if ($s == "") return 0;
for ($i = 0; $i < strlen($s); ++ $i) {
if ($s[$i] == " ") {
++ $ans;
while ($s[$i] == " ") {
++ $i;
}
}
}
return $ans + 1;
}

441. 排列硬幣

function arrangeCoins($n) {
$sum = 0;
if ($n == 0) return 0;
for ($i = 1; ; ++ $i) {
$sum += $i;
if ($sum <= $n and $sum + $i + 1 > $n) return $i;
}
}