Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions javascript/LeetCode/Array/1184.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/**
* 1184. Distance Between Bus Stops
*
* 從圓中(distance)找出從start到destination最短的距離
*
* @param {number[]} distance
* @param {number} start
* @param {number} destination
* @return {number}
*/
var distanceBetweenBusStops = function(distance, start, destination) {
let res = 0,total = distance.reduce((a,b)=>a + b);
if(start > destination){
let temp = start;
start = destination;
destination = temp;
}
for(let i = 0;i < distance.length;++i) {
if(i >= start && i < destination){
res += distance[i]
}
}
return Math.min(res,total - res);
};
// [0,1,2,3]
// let distance = [1,2,3,4], start = 0, destination = 2;
// ans.3 => 2+1
// 7 => 1+2+4
// Distance between 0 and 2 is 3 or 7, minimum is 3.

let distance = [7,10,1,12,11,14,5,0], start = 7, destination = 2;
// 17
console.log(distanceBetweenBusStops(distance,start,destination));
23 changes: 23 additions & 0 deletions javascript/LeetCode/Array/169.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/**
* 169. Majority Element
*
* 找出majority element = 出現次數大於 nums.length / 2
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function(nums) {
let map = new Map();
let ans = 0;
for(const i of nums){
map.has(i) ? map.set(i,map.get(i)+1) : map.set(i,1);
}
for(const [key,value] of map) {
if(value > (nums.length / 2)){
ans = key;
}
}
return ans;
};
let nums = [2,2,1,1,1,2,2];
// 2
console.log(majorityElement(nums));
43 changes: 43 additions & 0 deletions javascript/LeetCode/Array/1779.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/**
* 1779. Find Nearest Point That Has the Same X or Y Coordinate
*
* x & y = current location
* A point is valid if it shares the same x-coordinate or the same y-coordinate as your location.
* 傳回與目前位置曼哈頓距離最小的有效點的索引(從 0 開始索引)。
* 如果存在多個有效點,則傳回索引最小的有效點。如果沒有有效點,則傳回 -1。
*
* The Manhattan distance between two points (x1, y1) and (x2, y2) is abs(x1 - x2) + abs(y1 - y2).
*
* @param {number} x
* @param {number} y
* @param {number[][]} points
* @return {number}
*/
var nearestValidPoint = function(x, y, points) {
let ans = -1;
let smallest = Infinity;
for(let i = 0;i < points.length;++i) {
let prev = Math.abs(x - parseInt(points[i][0]));
let next = Math.abs(y - parseInt(points[i][1]));
if(prev * next === 0 && (prev + next) < smallest){
smallest = prev + next;
ans = i;
}

}
return ans;
};
// let x = 3, y = 4, points = [[1,2],[3,1],[2,4],[2,3],[4,4]];
// 2
// Of all the points, only [3,1], [2,4] and [4,4] are valid.
// Of the valid points, [2,4] and [4,4] have the smallest Manhattan distance from your current location, with a distance of 1.
// [2,4] has the smallest index, so return 2.

// let x = 3, y = 4, points = [[3,4]];
// 0
// let x = 3, y = 4, points = [[2,3]];
// -1

let x = 5, y = 1, points = [[1,1],[6,2],[1,5],[3,1]];
// 3
console.log(nearestValidPoint(x,y,points));
35 changes: 35 additions & 0 deletions javascript/LeetCode/Array/2154.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/**
* 2154. Keep Multiplying Found Values by Two
*
* 初次先尋找original是否在nums內,若不在直接回傳original
* 若在,則original * 2 = 新的original (重複此步驟直到找不到original為止)
*
* @param {number[]} nums
* @param {number} original
* @return {number}
*/
var findFinalValue = function(nums, original) {
nums.sort((a,b) => a - b);
for(let i = 0;i < nums.length;++i) {
if(nums.includes(original)){
original *= 2;
}
}
return original;

// solution 2
// nums.sort((a,b) => a - b);
// for(const a of nums){
// if(a === original){
// original*=2;
// }
// }
// return original;
};
// let nums = [5,3,6,1,12], original = 3;
// 24
// let nums = [2,7,9], original = 4;
// 4
let nums = [8,19,4,2,15,3], original = 2;
// 16
console.log(findFinalValue(nums,original));
12 changes: 12 additions & 0 deletions javascript/LeetCode/Array/219.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,18 @@ var containsNearbyDuplicate = function (nums, k) {
toMap.set(nums[i], i);
}
return false;

// solution 3.
// i & j => nums[i] == nums[j] & abs(i - j) <= k.
// nums[i]跟nums[j]一樣
// let map = new Map();
// for(let i = 0;i < nums.length;++i){
// if(map.has(nums[i]) && i - map.get(nums[i]) <= k){
// return true
// }
// map.set(nums[i],i);
// }
// return false;
};
const nums = [1, 2, 3, 1], k = 3; // return true
//Input: nums = [1,0,1,1], k = 1 return true
Expand Down
27 changes: 27 additions & 0 deletions javascript/LeetCode/Array/3151.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/**
* 3151. Special Array I
*
* 檢查陣列任兩個相鄰元素的奇偶性是否都不同。若是回傳true
* @param {number[]} nums
* @return {boolean}
*/
var isArraySpecial = function(nums) {
if(nums.length === 1){
return true;
}
for(let i = 0;i < nums.length;++i) {
let previous = nums[i];
let next = nums[i + 1];
if(previous % 2 !== next % 2){
continue;
}else{
return false;
}
}
return true;
};
// let nums = [4,3,1,6];
// false
let nums = [2,1];
// true
console.log(isArraySpecial(nums))
20 changes: 20 additions & 0 deletions javascript/LeetCode/Array/3190.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/**
* 3190. Find Minimum Operations to Make All Elements Divisible by Three
*
* 計算能將所有元素被3整除的步驟為幾,一次操作能將元素+1或-1。
*
* @param {number[]} nums
* @return {number}
*/
var minimumOperations = function(nums) {
let answer = 0;
for(let i = 0;i < nums.length;++i) {
if(nums[i] % 3 !== 0){
answer++;
}
}
return answer;
};
let nums = [1,2,3,4];
// 3
console.log(minimumOperations(nums));
37 changes: 37 additions & 0 deletions javascript/LeetCode/Array/3573.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/**
* 3573. Best Time to Buy and Sell Stock V
*
* 正常交易:i天買,j天賣(i < j),利潤:proces[j] - prices[i]
* 炒短線:i天賣,j天買回來(i < j),利潤:prices[i] - prices[j]
* 不能同一天買賣單張股票
* 回傳在交易k次後最多能賺多少
*
* @param {number[]} prices 第i天的股價
* @param {number} k 最多只能交易k次
* @return {number}
*/
var maximumProfit = function(prices, k) {
const firstPrice = prices[0];
const dp = Array(k + 1).fill(null).map(() => ({
maxProfit: 0,
buyHold: -firstPrice,
sellHold: firstPrice
}));
for(let i = 0;i < prices.length;++i) {
const current = prices[i];
for(let j = k;j > 0;--j) {
const prevProfit = dp[j - 1].maxProfit;
dp[j].maxProfit = Math.max(dp[j].maxProfit, dp[j].buyHold + current, dp[j].sellHold - current);
dp[j].buyHold = Math.max(dp[j].buyHold, prevProfit - current);
dp[j].sellHold = Math.max(dp[j].sellHold, prevProfit + current);
}
}
return dp[k].maxProfit;
};
let prices = [1,7,9,8,2], k = 2;
// 14
// can make $14 of profit through 2 transactions:
// A normal transaction: buy the stock on day 0 for $1 then sell it on day 2 for $9.
// A short selling transaction: sell the stock on day 3 for $8 then buy back on day 4 for $2.
// 9 - 1 = 8 ; 8 - 2 = 6; 8 + 6 = 14
// console.log(maximumProfit(prices,k))
20 changes: 20 additions & 0 deletions javascript/LeetCode/Array/3731.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/**
* 3731. Find Missing Elements
*
* 找出參數陣列中缺少的數字,並以陣列型態回傳
* @param {number[]} nums
* @return {number[]}
*/
var findMissingElements = function(nums) {
let ans = [];
let min = Math.min(...nums),max = Math.max(...nums);
for(let i = min;i <= max;++i){
if(nums.includes(i) === false){
ans.push(i);
}
}
return ans;
};
let nums = [5,1];
// [2,3,4]
console.log(findMissingElements(nums));
20 changes: 20 additions & 0 deletions javascript/LeetCode/String/168.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/**
* 168. Excel Sheet Column Title
*
* 給定一個整數 columnNumber,傳回其在 Excel 表格中對應的列標題。
* @param {number} columnNumber
* @return {string}
*/
var convertToTitle = function(columnNumber) {
let ans = "";
let baseASCIICode = "A".charCodeAt();
while(columnNumber > 0){
let offset = (columnNumber - 1) % 26;
ans = String.fromCharCode(baseASCIICode + offset) + ans;
columnNumber = parseInt((parseInt(columnNumber - 1) / 26));
}
return ans;
};
let columnNumber = 701;
// "ZY";
console.log(convertToTitle(columnNumber));
28 changes: 28 additions & 0 deletions javascript/LeetCode/String/1859.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/**
* 1859. Sorting the Sentence
*
* 字串句子中每個單字最後面都會有個數字,利用該數字重新將句子做排序,但結果每個單字不能有數字。
*
* @param {string} s
* @return {string}
*/
var sortSentence = function(s) {
let res = "";
let splitS = s.split(" ");
let map = new Map();
for(let i = 0;i < splitS.length;++i){
// 取得每個字的最後一個數字,並把它放入new map => key = int,value = str
const lastInt = parseInt(splitS[i].substring(splitS[i].length - 1));
map.set(lastInt,splitS[i].substring(0,splitS[i].length - 1));
}
// sort map
var mapAsc = new Map([...map.entries()].sort());
for(const [key,value] of mapAsc) {
res += " "+value;
}
return res.trim()
};
let s = "is2 sentence4 This1 a3";
// Output: "This is a sentence"
// Explanation: Sort the words in s to their original positions "This1 is2 a3 sentence4", then remove the numbers.
console.log(sortSentence(s));
63 changes: 63 additions & 0 deletions javascript/LeetCode/String/1930.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/**
* 1930. Unique Length-3 Palindromic Subsequences
*
* 回傳屬於s迴文的子字串
*
* @param {string} s
* @return {number}
*/
var countPalindromicSubsequence = function(s) {
// 只能有3個字母,第一個字母和最後一個字母是一樣的,唯獨中間字母不同 = 迴文
// 會有一個字母出現至少2次

// solution 1.
// let ans = 0;
// let set = new Set(s);
// for(const char of set) {
// let start = s.indexOf(char);
// let end = s.lastIndexOf(char);

// if(start < end){
// ans += new Set(s.slice(start + 1, end)).size;
// }
// }
// return ans;

// solution 2.
let map = new Map();
let ans =0;
for(let i = 0;i < s.length;++i) {
if (!map.has(s[i])) {
map.set(s[i], []);
}
map.get(s[i]).push(i);
}
console.log(map)
for(const [char,index] of map) {
const start = index[0];
const end = index[index.length - 1];
if (end - start <= 1) {
continue;
}

const set = new Set();
for (let i = start + 1; i < end; i++) {
set.add(s[i]);
}
ans += set.size;
}
return ans;
};
// let s = "aabca";
/**
* 3
* The 3 palindromic subsequences of length 3 are:
* "aba" (subsequence of "aabca")
* "aaa" (subsequence of "aabca")
* "aca" (subsequence of "aabca")
*/
// let s = "uuuuu";
// 1
let s ="ckafnafqo"
// 4
console.log(countPalindromicSubsequence(s));
Loading