嘗試 Leetcode

icecho發表於2019-03-18

記錄一下自己的小小成長,如果大家有更好更優雅的解法,也可告知我,接受大家一切意見!

GitHub

Two Sum

給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個陣列中同樣的元素。

給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

嘗試解法
class Solution
{

    /**
     * @param Integer[] $nums
     * @param Integer $target
     * @return Integer[]
     */
    function twoSum($nums, $target)
    {
        if (!isset($nums[1])) return;
        foreach ($nums as $key => $num) {
            unset($nums[$key]);
            $result = array_search($target - $num, $nums);
            if ($result !== false) return [$key, $result];
        }
    }
}
目前最優解法
class Solution {

    function twoSum($nums, $target) { 
        $numsCopy = $nums; 
        sort($numsCopy); 
        $num = count($numsCopy); 
        $low = 0; 
        $high = $num-1;

         while($high > $low){
             $sum = $numsCopy[$low] + $numsCopy[$high];
             if($sum == $target){
                $a = $numsCopy[$low];
                $b = $numsCopy[$high];
                break;
             }else if($sum > $target){
                $high--;
             }else{
                $low++;
             }
          }
          for ($i = 0; $i < $num; $i++){
             if($a == $nums[$i]){
                $keyLow = $i;
                break;
             }
          }

          for ($i = $num-1; $i >= 0; $i--){
             if($b == $nums[$i]){
                $keyHigh = $i;
                break;
             }
          }
          return array($keyLow,$keyHigh);
    } 
}

Reverse Integer

給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。

輸入: 123
輸出: 321

輸入: -123
輸出: -321

嘗試解法
class Solution 
{

    /**
     * @param Integer $x
     * @return Integer
     */
    function reverse($x) {
        $result = 0;
        while (abs($x) > 9) {
            $num = $x % 10;
            $x = (int)($x / 10);
            $result = $result * 10 + $num;
        }
        $result = $result * 10 + $x;
        if (strlen(base_convert($result, 10, 2)) > 31) return 0;
        return $result;
    }
}

Palindrome Number

判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

輸入: 121
輸出: true

輸入: -123
輸出: false

嘗試解法
class Solution
{

    /**
     * @param Integer $x
     * @return Boolean
     */
    function isPalindrome($x)
    {
        if ($x < 0) return false;
        if ($x % 10 === 0 && $x != 0) return false;
        $reverse = 0;
        while ($x > $reverse) {
            $reverse = (int)($reverse * 10 + $x % 10);
            $x = (int)($x / 10);
        }
        return $x === $reverse || $x === (int)($reverse / 10);
    }
}

Roman to Integer

題目有點長,我把連結放這兒哈。檢視

嘗試解法
class Solution
{

    /**
     * @param String $s
     * @return Integer
     */
    function romanToInt($s)
    {
        $romanMap = [
            1 => 'I',
            5 => 'V',
            10 => 'X',
            50 => 'L',
            100 => 'C',
            500 => 'D',
            1000 => 'M',
        ];

        $nums = [];
        $s = str_split($s, 1);

        foreach ($s as $key => $item) {
            array_push($nums, array_search($item, $romanMap));
        }

        $num = 0;
        for ($i = 0; $i < count($nums) - 1; $i++) {
            if ($nums[$i + 1] > $nums[$i]) {
                $num += $nums[$i + 1] - $nums[$i];
                $i++;
            } else {
                $num += $nums[$i];
            }
        }

        if (isset($nums[$i])) {
            return $num + $nums[$i];
        }

        return $num;
    }
}

Longest Common Prefix

編寫一個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串。

輸入: ["flower","flow","flight"]
輸出: "fl"

嘗試解法
class Solution

{

    /**
     * @param String[] $strs
     * @return String
     */
    function longestCommonPrefix($strs)
    {
        usort($strs, function ($current, $next) {
            return strlen($current) > strlen($next);
        });
        $result = '';
        $temp = '';
        foreach (str_split($strs[0], 1) as $str) {
            $temp .= $str;
            for ($i = 1; $i < count($strs); $i++) {
                if (strpos($strs[$i], $temp) !== 0) break 2;
            }
            $result .= $str;
        }
        return $result;
    }
}

Valid Parentheses

給定一個只包括 '('')''{''}''['']' 的字串,判斷字串是否有效。

輸入: "()[]{}"
輸出: true
輸入: "(]"
輸出: false

嘗試解法
class Solution
{
    /**
     * @param String $s
     * @return Boolean
     */
    function isValid($s)
    {
        if (empty($s)) return true;
        $s = str_split($s);
        if (count($s) % 2 !== 0) return false;
        $leftMap = [
            ')' => '(',
            '}' => '{',
            ']' => '['
        ];
        $leftStack = [];
        while (1) {
            if (in_array(current($s), $leftMap)) {
                array_push($leftStack, current($s));
            } else {
                if (array_pop($leftStack) !== $leftMap[current($s)]) {
                    return false;
                }
            }
            if(!next($s)) break;
        }
        return $leftStack === [];
    }
}

Merge two sorted lists

將兩個有序連結串列合併為一個新的有序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。

輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4

嘗試解法
class Solution
{
    /**
     * @param ListNode $l1
     * @param ListNode $l2
     * @return ListNode
     */
    function mergeTwoLists($l1, $l2)
    {
        if (!$l1 || !$l2) return $l1 ?? $l2;
        if ($l1->val < $l2->val) {
            $list = $l1;
            $list->next = $this->mergeTwoLists($l1->next, $l2);
        } else {
            $list = $l2;
            $list->next = $this->mergeTwoLists($l1, $l2->next);
        }
        return $list;
    }
}

Remove Duplicates from Sorted Array

給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。
不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 O(1) 額外空間的條件下完成。

給定陣列 nums = [1, 1, 2]
函式應該返回新的長度 2,並且原陣列 nums 的前兩個元素被修改為 1,2
你不需要考慮陣列中超出新長度後面的元素

嘗試解法
class Solution
{
    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function removeDuplicates(&$nums)
    {
        $i = 0;
        for ($j = 1; $j < count($nums); $j++) {
            if ($nums[$j] != $nums[$i]) {
                $i++;
                $nums[$i] = $nums[$j];
            }
        }
        return $i + 1;
    }
}

Remove Element

給定 nums = [3,2,2,3], val = 3
函式應該返回新的長度 2, 並且 nums 中的前兩個元素均為 2
你不需要考慮陣列中超出新長度後面的元素

嘗試解法
class Solution
{
    /**
     * @param Integer[] $nums
     * @param Integer $val
     * @return Integer
     */
    function removeElement(&$nums, $val)
    {
        $i = 0;
        for ($j = 0; $j < count($nums); $j++) {
            if ($nums[$j] !== $val) {
                $nums[$i] = $nums[$j];
                $i++;
            }
        }
        return $i;
    }
}

Implement strstr

輸入: haystack = "hello", needle = "ll"
輸出: 2

嘗試解法
class Solution
{
    /**
     * @param String $haystack
     * @param String $needle
     * @return Integer
     */
    function strStr($haystack, $needle)
    {
        if (!$needle) {
            return 0;
        }
        if (strlen($needle) > strlen($haystack)) {
            return -1;
        }
        if (strlen($needle) === strlen($haystack)) {
            for ($i = 0; $i < strlen($needle); $i++) {
                if ($needle[$i] != $haystack[$i]) {
                    return -1;
                }
            }
            return 0;
        }
        $i = 0;
        for ($j = 0; $j < strlen($haystack) - strlen($needle) + 1; $j++) {
            if ($haystack[$j] === $needle[$i]) {
                $i += 1;
                while ($i < strlen($needle)) {
                    if ($needle[$i] !== $haystack[$j + $i]) {
                        $i = 0;
                        break;
                    }
                    $i += 1;
                }
                if ($i === strlen($needle)) {
                    return $j;
                }
            }
        }
        return -1;
    }
}

Search Insert Position

給定一個排序陣列和一個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。
你可以假設陣列中無重複元素。

嘗試解法
class Solution
{
    /**
     * @param Integer[] $nums
     * @param Integer $target
     * @return Integer
     */
    function searchInsert($nums, $target)
    {
        if (in_array($target, $nums)) {
            return array_search($target, $nums);
        }

        if (current($nums) > $target) {
            array_unshift($nums, $target);
            return 0;
        }

        if (end($nums) < $target) {
            array_push($nums, $target);
            return count($nums) - 1;
        }

        array_push($nums, $target);
        sort($nums);
        return array_search($target, $nums);
    }
}

Length of Last Word

輸入: "Hello World"
輸出: 5

嘗試解法
class Solution
{
    /**
     * @param String $s
     * @return Integer
     */
    function lengthOfLastWord($s)
    {
        $s = strrev(trim($s));
        $length = 0;
        for ($i = 0; $i < strlen($s); $i++) {
            if ($s[$i] === ' ') {
                return $length;
            }
            $length++;
        }
        return $length;
    }
}

class Solution
{
    function lengthOfLastWord($s)
    {
        $s = explode(' ', trim($s));
        return strlen(end($s));
    }
}

Plus One

輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入陣列表示數字 123

嘗試解法
class Solution
{
    /**
     * @param Integer[] $digits
     * @return Integer[]
     */
    function plusOne($digits)
    {
        for ($i = array_key_last($digits); $i > -1; $i--) {
            if ($digits[$i] === 9) {
                $digits[$i] = 0;
                continue;
            }
            if ($digits[$i] < 9) {
                $digits[$i] = $digits[$i] + 1;
                return $digits;
            }
        }
        array_unshift($digits, 1);
        return $digits;
    }
}

Add Binary

輸入: a = "11", b = "1"
輸出: "100"

嘗試解法
class Solution
{
    /**
     * @param String $a
     * @param String $b
     * @return String
     */
    function addBinary($a, $b)
    {
        $result = '';

        if (strlen($a) > strlen($b)) {
            $b = str_pad($b, strlen($a), 0, STR_PAD_LEFT);
        } else {
            $a = str_pad($a, strlen($b), 0, STR_PAD_LEFT);
        }

        for ($i = 0; $i < strlen($a); $i++) {
            $result .= $a[$i] + $b[$i];
        }

        $result = strrev($result);

        for ($i = 0; $i < strlen($result); $i++) {
            if ($result[$i] < 2) {
                continue;
            }

            $result[$i] = $result[$i] - 2;
            if (isset($result[$i + 1])) {
                $result[$i + 1] = $result[$i + 1] + 1;
                continue;
            }

            $result .= 1;
        }

        return strrev($result);
    }
}

Combine Two Tables

題目

select FirstName, LastName, City, State
from Person left join Address
on Person.PersonId = Address.PersonId;

Single Number

給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

輸入: [2,2,1]
輸出: 1

class Solution
{

    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function singleNumber($nums)
    {
        $result = 0;
        foreach ($nums as $num) {
            $result ^= $num;
        }

        return $result;
    }
}

Hello。

相關文章