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

     

  • 相关阅读:
    P1093 奖学金
    『模板』快速排序
    [模板]选择排序&&冒泡排序&&插入排序
    CF898A Rounding
    计算细胞数【BFS】
    字符串匹配问题(lfyzoj)
    [HDU]4694 Important Sisters(支配树)
    [BZOJ]4650: [Noi2016]优秀的拆分
    [BZOJ]4908: [BeiJing2017]开车
    [洛谷]P3729 曼哈顿计划EX(最小割树/等价流树)
  • 原文地址:https://www.cnblogs.com/GetcharZp/p/13357624.html
Copyright © 2020-2023  润新知