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;
  }
}

 

posted @ 2020-07-21 21:44  GetcharZp  阅读(334)  评论(0编辑  收藏  举报