Skip to content

Commit 8db9e3d

Browse files
authored
Merge pull request #151 from clingoram/mavis
新增解題練習
2 parents 23b98f4 + 68551d6 commit 8db9e3d

24 files changed

Lines changed: 677 additions & 78 deletions

File tree

javascript/LeetCode/Array/1184.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* 1184. Distance Between Bus Stops
3+
*
4+
* 從圓中(distance)找出從start到destination最短的距離
5+
*
6+
* @param {number[]} distance
7+
* @param {number} start
8+
* @param {number} destination
9+
* @return {number}
10+
*/
11+
var distanceBetweenBusStops = function(distance, start, destination) {
12+
let res = 0,total = distance.reduce((a,b)=>a + b);
13+
if(start > destination){
14+
let temp = start;
15+
start = destination;
16+
destination = temp;
17+
}
18+
for(let i = 0;i < distance.length;++i) {
19+
if(i >= start && i < destination){
20+
res += distance[i]
21+
}
22+
}
23+
return Math.min(res,total - res);
24+
};
25+
// [0,1,2,3]
26+
// let distance = [1,2,3,4], start = 0, destination = 2;
27+
// ans.3 => 2+1
28+
// 7 => 1+2+4
29+
// Distance between 0 and 2 is 3 or 7, minimum is 3.
30+
31+
let distance = [7,10,1,12,11,14,5,0], start = 7, destination = 2;
32+
// 17
33+
console.log(distanceBetweenBusStops(distance,start,destination));

javascript/LeetCode/Array/169.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* 169. Majority Element
3+
*
4+
* 找出majority element = 出現次數大於 nums.length / 2
5+
* @param {number[]} nums
6+
* @return {number}
7+
*/
8+
var majorityElement = function(nums) {
9+
let map = new Map();
10+
let ans = 0;
11+
for(const i of nums){
12+
map.has(i) ? map.set(i,map.get(i)+1) : map.set(i,1);
13+
}
14+
for(const [key,value] of map) {
15+
if(value > (nums.length / 2)){
16+
ans = key;
17+
}
18+
}
19+
return ans;
20+
};
21+
let nums = [2,2,1,1,1,2,2];
22+
// 2
23+
console.log(majorityElement(nums));

javascript/LeetCode/Array/1779.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
* 1779. Find Nearest Point That Has the Same X or Y Coordinate
3+
*
4+
* x & y = current location
5+
* A point is valid if it shares the same x-coordinate or the same y-coordinate as your location.
6+
* 傳回與目前位置曼哈頓距離最小的有效點的索引(從 0 開始索引)。
7+
* 如果存在多個有效點,則傳回索引最小的有效點。如果沒有有效點,則傳回 -1。
8+
*
9+
* The Manhattan distance between two points (x1, y1) and (x2, y2) is abs(x1 - x2) + abs(y1 - y2).
10+
*
11+
* @param {number} x
12+
* @param {number} y
13+
* @param {number[][]} points
14+
* @return {number}
15+
*/
16+
var nearestValidPoint = function(x, y, points) {
17+
let ans = -1;
18+
let smallest = Infinity;
19+
for(let i = 0;i < points.length;++i) {
20+
let prev = Math.abs(x - parseInt(points[i][0]));
21+
let next = Math.abs(y - parseInt(points[i][1]));
22+
if(prev * next === 0 && (prev + next) < smallest){
23+
smallest = prev + next;
24+
ans = i;
25+
}
26+
27+
}
28+
return ans;
29+
};
30+
// let x = 3, y = 4, points = [[1,2],[3,1],[2,4],[2,3],[4,4]];
31+
// 2
32+
// Of all the points, only [3,1], [2,4] and [4,4] are valid.
33+
// Of the valid points, [2,4] and [4,4] have the smallest Manhattan distance from your current location, with a distance of 1.
34+
// [2,4] has the smallest index, so return 2.
35+
36+
// let x = 3, y = 4, points = [[3,4]];
37+
// 0
38+
// let x = 3, y = 4, points = [[2,3]];
39+
// -1
40+
41+
let x = 5, y = 1, points = [[1,1],[6,2],[1,5],[3,1]];
42+
// 3
43+
console.log(nearestValidPoint(x,y,points));

javascript/LeetCode/Array/2154.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/**
2+
* 2154. Keep Multiplying Found Values by Two
3+
*
4+
* 初次先尋找original是否在nums內,若不在直接回傳original
5+
* 若在,則original * 2 = 新的original (重複此步驟直到找不到original為止)
6+
*
7+
* @param {number[]} nums
8+
* @param {number} original
9+
* @return {number}
10+
*/
11+
var findFinalValue = function(nums, original) {
12+
nums.sort((a,b) => a - b);
13+
for(let i = 0;i < nums.length;++i) {
14+
if(nums.includes(original)){
15+
original *= 2;
16+
}
17+
}
18+
return original;
19+
20+
// solution 2
21+
// nums.sort((a,b) => a - b);
22+
// for(const a of nums){
23+
// if(a === original){
24+
// original*=2;
25+
// }
26+
// }
27+
// return original;
28+
};
29+
// let nums = [5,3,6,1,12], original = 3;
30+
// 24
31+
// let nums = [2,7,9], original = 4;
32+
// 4
33+
let nums = [8,19,4,2,15,3], original = 2;
34+
// 16
35+
console.log(findFinalValue(nums,original));

javascript/LeetCode/Array/219.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,18 @@ var containsNearbyDuplicate = function (nums, k) {
7676
toMap.set(nums[i], i);
7777
}
7878
return false;
79+
80+
// solution 3.
81+
// i & j => nums[i] == nums[j] & abs(i - j) <= k.
82+
// nums[i]跟nums[j]一樣
83+
// let map = new Map();
84+
// for(let i = 0;i < nums.length;++i){
85+
// if(map.has(nums[i]) && i - map.get(nums[i]) <= k){
86+
// return true
87+
// }
88+
// map.set(nums[i],i);
89+
// }
90+
// return false;
7991
};
8092
const nums = [1, 2, 3, 1], k = 3; // return true
8193
//Input: nums = [1,0,1,1], k = 1 return true

javascript/LeetCode/Array/3151.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* 3151. Special Array I
3+
*
4+
* 檢查陣列任兩個相鄰元素的奇偶性是否都不同。若是回傳true
5+
* @param {number[]} nums
6+
* @return {boolean}
7+
*/
8+
var isArraySpecial = function(nums) {
9+
if(nums.length === 1){
10+
return true;
11+
}
12+
for(let i = 0;i < nums.length;++i) {
13+
let previous = nums[i];
14+
let next = nums[i + 1];
15+
if(previous % 2 !== next % 2){
16+
continue;
17+
}else{
18+
return false;
19+
}
20+
}
21+
return true;
22+
};
23+
// let nums = [4,3,1,6];
24+
// false
25+
let nums = [2,1];
26+
// true
27+
console.log(isArraySpecial(nums))

javascript/LeetCode/Array/3190.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* 3190. Find Minimum Operations to Make All Elements Divisible by Three
3+
*
4+
* 計算能將所有元素被3整除的步驟為幾,一次操作能將元素+1或-1。
5+
*
6+
* @param {number[]} nums
7+
* @return {number}
8+
*/
9+
var minimumOperations = function(nums) {
10+
let answer = 0;
11+
for(let i = 0;i < nums.length;++i) {
12+
if(nums[i] % 3 !== 0){
13+
answer++;
14+
}
15+
}
16+
return answer;
17+
};
18+
let nums = [1,2,3,4];
19+
// 3
20+
console.log(minimumOperations(nums));

javascript/LeetCode/Array/3573.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* 3573. Best Time to Buy and Sell Stock V
3+
*
4+
* 正常交易:i天買,j天賣(i < j),利潤:proces[j] - prices[i]
5+
* 炒短線:i天賣,j天買回來(i < j),利潤:prices[i] - prices[j]
6+
* 不能同一天買賣單張股票
7+
* 回傳在交易k次後最多能賺多少
8+
*
9+
* @param {number[]} prices 第i天的股價
10+
* @param {number} k 最多只能交易k次
11+
* @return {number}
12+
*/
13+
var maximumProfit = function(prices, k) {
14+
const firstPrice = prices[0];
15+
const dp = Array(k + 1).fill(null).map(() => ({
16+
maxProfit: 0,
17+
buyHold: -firstPrice,
18+
sellHold: firstPrice
19+
}));
20+
for(let i = 0;i < prices.length;++i) {
21+
const current = prices[i];
22+
for(let j = k;j > 0;--j) {
23+
const prevProfit = dp[j - 1].maxProfit;
24+
dp[j].maxProfit = Math.max(dp[j].maxProfit, dp[j].buyHold + current, dp[j].sellHold - current);
25+
dp[j].buyHold = Math.max(dp[j].buyHold, prevProfit - current);
26+
dp[j].sellHold = Math.max(dp[j].sellHold, prevProfit + current);
27+
}
28+
}
29+
return dp[k].maxProfit;
30+
};
31+
let prices = [1,7,9,8,2], k = 2;
32+
// 14
33+
// can make $14 of profit through 2 transactions:
34+
// A normal transaction: buy the stock on day 0 for $1 then sell it on day 2 for $9.
35+
// A short selling transaction: sell the stock on day 3 for $8 then buy back on day 4 for $2.
36+
// 9 - 1 = 8 ; 8 - 2 = 6; 8 + 6 = 14
37+
// console.log(maximumProfit(prices,k))

javascript/LeetCode/Array/3731.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* 3731. Find Missing Elements
3+
*
4+
* 找出參數陣列中缺少的數字,並以陣列型態回傳
5+
* @param {number[]} nums
6+
* @return {number[]}
7+
*/
8+
var findMissingElements = function(nums) {
9+
let ans = [];
10+
let min = Math.min(...nums),max = Math.max(...nums);
11+
for(let i = min;i <= max;++i){
12+
if(nums.includes(i) === false){
13+
ans.push(i);
14+
}
15+
}
16+
return ans;
17+
};
18+
let nums = [5,1];
19+
// [2,3,4]
20+
console.log(findMissingElements(nums));

javascript/LeetCode/String/168.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* 168. Excel Sheet Column Title
3+
*
4+
* 給定一個整數 columnNumber,傳回其在 Excel 表格中對應的列標題。
5+
* @param {number} columnNumber
6+
* @return {string}
7+
*/
8+
var convertToTitle = function(columnNumber) {
9+
let ans = "";
10+
let baseASCIICode = "A".charCodeAt();
11+
while(columnNumber > 0){
12+
let offset = (columnNumber - 1) % 26;
13+
ans = String.fromCharCode(baseASCIICode + offset) + ans;
14+
columnNumber = parseInt((parseInt(columnNumber - 1) / 26));
15+
}
16+
return ans;
17+
};
18+
let columnNumber = 701;
19+
// "ZY";
20+
console.log(convertToTitle(columnNumber));

0 commit comments

Comments
 (0)