記錄一下自己的小小成長,如果大家有更好更優雅的解法,也可告知我,接受大家一切意見!
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;
}
}