09 Jul 2024
Leetcode Top Interview 150 的其中一題
題目描述
Given an integer array nums sorted in non-decreasing order, remove the duplicates in-place such that each unique element appears only once. The relative order of the elements should be kept the same. Then return the number of unique elements in nums.
Consider the number of unique elements of nums to be k, to get accepted, you need to do the following things:
- Change the array nums such that the first k elements of nums contain the unique elements in the order they were present in nums initially. The remaining elements of nums are not important as well as the size of nums.
- Return k.
Custom Judge:
The judge will test your solution with the following code:
int[] nums = [...]; // Input array
int[] expectedNums = [...]; // The expected answer with correct length
int k = removeDuplicates(nums); // Calls your implementation
assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
assert nums[i] == expectedNums[i];
}
If all assertions pass, then your solution will be accepted.
範例
Example 1:
Input: nums = [1,1,2]
Output: 2, nums = [1,2,_]
Explanation: Your function should return k = 2, with the first two elements of nums being 1 and 2 respectively.
It does not matter what you leave beyond the returned k (hence they are underscores).
Example 2:
Input: nums = [0,0,1,1,1,2,2,3,3,4]
Output: 5, nums = [0,1,2,3,4,_,_,_,_,_]
Explanation: Your function should return k = 5, with the first five elements of nums being 0, 1, 2, 3, and 4 respectively.
It does not matter what you leave beyond the returned k (hence they are underscores).
Constraints
- 1 <= nums.length <= 3 * 10^4
- -100 <= nums[i] <= 100
nums
is sorted in non-decreasing order.
解法
解法一
解題思路:
把出現第二次以上的數字更改為 101 ,並將 duplicate +1 。因為nums[i]最大為 100,101一定會在排序時被排到最後面 ,所以前 len(nums) - duplicate 個數字一定都只出現一次
func removeDuplicates(nums []int) int {
prev := nums[0]
duplicate := 0
for i:=1; i<len(nums); i++ {
if nums[i] == prev {
nums[i] =101
duplicate++
} else {
prev = nums[i]
}
}
sort.Ints(nums)
return len(nums) - duplicate
}
05 Jul 2024
Leetcode Top Interview 150 的其中一題
題目描述
You are given two integer arrays nums1
and nums2
, sorted in non-decreasing order, and two integers m and n, representing the number of elements in nums1
and nums2
respectively.
Merge nums1
and nums2
into a single array sorted in non-decreasing order.
The final sorted array should not be returned by the function, but instead be stored inside the array nums1
. To accommodate this, nums1
has a length of m + n, where the first m elements denote the elements that should be merged, and the last n elements are set to 0 and should be ignored.nums2
has a length of n.
範例
Example 1:
Input: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
Output: [1,2,2,3,5,6]
Explanation: The arrays we are merging are [1,2,3] and [2,5,6].
The result of the merge is [1,2,2,3,5,6] with the underlined elements coming from nums1.
Example 2:
Input: nums1 = [1], m = 1, nums2 = [], n = 0
Output: [1]
Explanation: The arrays we are merging are [1] and [].
The result of the merge is [1].
Example 3:
Input: nums1 = [0], m = 0, nums2 = [1], n = 1
Output: [1]
Explanation: The arrays we are merging are [] and [1].
The result of the merge is [1].
Note that because m = 0, there are no elements in nums1. The 0 is only there to ensure the merge result can fit in nums1.
Constraints
- nums1.length == m + n
- nums2.length == n
- 0 <= m, n <= 200
- 1 <= m + n <= 200
- -10^9 <= nums1[i], nums2[j] <= 10^9
Follow up: Can you come up with an algorithm that runs in O(m + n) time?
解法
解法一
第一個解法有點簡單暴力,把 nums2 的值放到nums1 後段後,直接做排序
func merge(nums1 []int, m int, nums2 []int, n int) {
for j := m; j < len(nums1); j++ {
nums1[j] = nums2[j-m]
}
sort.Ints(nums1)
}
解法二
這個解法很巧妙!因為 nums1
最後 n 格是空的,所以我們可以從 nums1
有數值的地方的尾巴(nums1
最大的值) 和 nums2
最大的值開始比較,把比較大的填到 nums1
的最後,以此類推,從大的開始填
func merge(nums1 []int, m int, nums2 []int, n int) {
k := m+n-1 //最後一格
i := m-1
j := n-1
for j>=0 {
if i >= 0 && (nums1[i] > nums2[j]) {
nums1[k] = nums1[i]
i--
} else {
nums1[k] = nums2[j]
j--
}
k--
}
}
12 May 2024
在試著打自己寫的 api 時,發現 Body 明明有以 JSON 的方式傳遞,使用 fetch
function 打出去的時候,對面卻找不到Body,後來發現是兩個原因:
- express 少了
app.use(express.json())
- fetch function 的 Header 少了
"Content-Type": "application/json"
24 Apr 2024
出現這個錯誤的解決辦法:
在 tsconfig.json 的 compilerOptions 中加上一行:
"compilerOptions": {
"allowJs": true,
}
29 Mar 2024
在執行下面程式碼的時候:
sqlStatement := `INSERT INTO tx (urls) VALUES($1) RETURNING id`
res, err := db.Exec(sqlStatement, pq.Array(body.Urls))
id, err := res.LastInsertId()
出現下面錯誤:
LastInsertId is not supported by this driver
這是因為 LastInsertId() 不支援 Postgresql driver
解決方式
將程式碼改為如下:
sqlStatement := `INSERT INTO tx (urls) VALUES($1) RETURNING id`
var id int
err = db.QueryRow(sqlStatement, pq.Array(body.Urls)).Scan(&id)