# Leetcode 練習筆記 ## [30 Days of LC JavaScript Challenge](https://leetcode.com/discuss/study-guide/3458761/Open-to-Registration!-30-Days-of-LC-JavaScript-Challenge/?utm_campaign=Banner9&utm_medium=Banner&utm_source=Banner&gio_link_id=xRxVYXjo) ## Day30 ### Day ### Day ### Day ### Day ### Day ### Day ### Day ### Day ### Day ### Day ### Day ### Day ### Day ### Day ### Day ### Day ### Day ## Day12 ### Day11 ### Day10 >Input: fn = function sum(a, b, c) { return a + b + c; } inputs = [[1,2],[3]] Output: 6 Explanation: curriedSum(1, 2)(3) should return the same value as sum(1, 2, 3). ```javascript var curry = function(fn) { return function curried(...args) { if (args.length >= fn.length) { // 如果傳入的參數數量已達到原函式所需的參數數量,則直接執行原函式 return fn(...args); } else { // 如果傳入的參數數量不足,則返回一個新的柯里化函式,等待更多的參數傳入 return function(...moreArgs) { return curried(...args.concat(moreArgs)); }; } }; }; // 測試 function sum(a, b, c) { return a + b + c; } const curriedSum = curry(sum); console.log(curriedSum()(1, 2, 3)); // 6 console.log(curriedSum(1)(2)(3)); // 6 console.log(curriedSum(1, 2)(3)); // 6 console.log(curriedSum(1)(2, 3)); // 6 ``` ### Day9 Memoize >Input "sum" ["call","call","getCallCount","call","getCallCount"] [[2,2],[2,2],[],[1,2],[]] Output [4,4,1,3,2] **Explanation** const sum = (a, b) => a + b; const memoizedSum = memoize(sum); memoizedSum(2, 2); // Returns 4. sum() was called as (2, 2) was not seen before. memoizedSum(2, 2); // Returns 4. However sum() was not called because the same inputs were seen before. // Total call count: 1 memoizedSum(1, 2); // Returns 3. sum() was called as (1, 2) was not seen before. // Total call count: 2 ```javascript function memoize(fn) { const cache = {};//用一個物件來儲存 放入的input跟結果 return function (...args) { const key = JSON.stringify(args); 由於物件的key只能是string所以必須透過stringify來讓args這個array變成可以儲存的key if (key in cache) { return cache[key]; } const functionOutput = fn(...args); cache[key] = functionOutput; return functionOutput; }; } ``` ### Day8 Allow One Function Call >Input: fn = (a,b,c) => (a * b * c), calls = [[5,7,4],[2,3,6],[4,6,8]] Output: [{"calls":1,"value":140}] Explanation: const onceFn = once(fn); onceFn(5, 7, 4); // 140 onceFn(2, 3, 6); // undefined, fn was not called onceFn(4, 6, 8); // undefined, fn was not called ```javascript var once = function(fn) { let hasBeenCalled = false; return function(...args){ if (hasBeenCalled) { return undefined; } else { hasBeenCalled = true; return fn(...args); } } }; ``` ### Day7 Function Composition >Input: functions = [x => x + 1, x => x * x, x => 2 * x], x = 4 Output: 65 Explanation: Evaluating from right to left ... Starting with x = 4. 2 * (4) = 8 (8) * (8) = 64 (64) + 1 = 65 ```javascript var compose = function(functions) { return function(x) { let result=x; for(let i=functions.length-1;i>=0;i--){ result=functions[i](result); } return result; } }; ``` ### Day6 Array Reduce Transformation >Input: nums = [1,2,3,4] fn = function sum(accum, curr) { return accum + curr * curr; } init = 100 Output: 130 Explanation: initially, the value is init=100. (100) + nums[0]^2 = 101 (101) + nums[1]^2 = 105 (105) + nums[2]^2 = 114 (114) + nums[3]^2 = 130 The final answer is 130. ```javascript var reduce = function(nums, fn, init) { let result=init; for(let i=0;i<nums.length;i++){ result=fn(result,nums[i]) } return result; }; ``` ### Day5 Filter Elements from Array >Example 1: Input: arr = [0,10,20,30], fn = function greaterThan10(n) { return n > 10; } Output: [20,30] Explanation: const newArray = filter(arr, fn); // [20, 30] The function filters out values that are not greater than 10 >Example 2: Input: arr = [1,2,3], fn = function firstIndex(n, i) { return i === 0; } Output: [1] Explanation: fn can also accept the index of each element In this case, the function removes elements not at index 0 ```javascript var filter = function(arr, fn) { const result=[]; for(let i=0;i<arr.length;i++){ if (fn(arr[i],i)){ result.push(arr[i]) } } return result; }; ``` ### Day4 Apply Transform Over Each Element in Array >Input: arr = [1,2,3], fn = function plusI(n, i) { return n + i; } Output: [1,3,5] Explanation: The function increases each value by the index it resides in. ```javascript var map = function(arr, fn) { return arr.map((item,i)=>fn(item,i)); }; ``` ### Day3 Counter II(closure) >Input: init = 0, calls = ["increment","increment","decrement","reset","reset"] Output: [1,2,1,0,0] Explanation: const counter = createCounter(0); counter.increment(); // 1 counter.increment(); // 2 counter.decrement(); // 1 counter.reset(); // 0 counter.reset(); // 0 ```javascript var createCounter = function(init) { let currentCount = init; function increment() { return ++currentCount; } function decrement() { currentCount -= 1; return currentCount; } function reset() { return (currentCount = init); } return { increment, decrement, reset }; }; ``` ### Day2 Counter(closure) >Input: n = -2 ["call","call","call","call","call"] Output: [-2,-1,0,1,2] Explanation: counter() initially returns -2. Then increases after each sebsequent call. ```javascript var createCounter = function(n) { let input=n-1; return function() { input++; return input; }; }; ``` ### Day1 Create Hello World Function(closure) ```javascript var createHelloWorld = function() { return function(...args) { return "Hello World" } }; ``` 1. question: >Input: s = "codeleet", indices = [4,5,6,7,0,2,1,3] Output: "leetcode" Explanation: As shown, "codeleet" becomes "leetcode" after shuffling. ```javascript var restoreString = function(s, indices) { let shuffled = new Array(s.length); for (let i = 0; i < indices.length; i++) { shuffled[indices[i]] = s.charAt(i); } return shuffled.join(''); }; //let arr = new Array(); // -> [] 給arr長度但內容仍然是空的 //[ <8 empty items> ] //charAt() 方法从一个字符串中返回指定的字符。 ``` 2. Deci-Binary Numbers >Example 1: Input: n = "32" Output: 3 Explanation: 10 + 11 + 11 = 32 >Example 2: Input: n = "82734" Output: 8 82734-11111-11111-10111-10101-10100-10100-10100-10000 ==>要做八次才能使得82734變成00000 >Example 3: Input: n = "27346209830709182346" Output: 9 (換言之就是找到最大的數字) ```javascript var minPartitions = function(n) { const nArr=n.split(''); const numArr=nArr.map(s=>parseInt(s)); return Math.max(...numArr); }; ``` 3. Reduce >const array1 = [1, 2, 3, 4]; // 0 + 1 + 2 + 3 + 4 const initialValue = 0; const sumWithInitial = array1.reduce( (accumulator, currentValue) => accumulator + currentValue, initialValue ); 4. Question >Input: nums = [10,4,8,3] Output: [15,1,11,22] Explanation: The array leftSum is [0,10,14,22] and the array rightSum is [15,11,3,0]. The array answer is [|0 - 15|,|10 - 11|,|14 - 3|,|22 - 0|] = [15,1,11,22]. ```javascript var leftRigthDifference = function(nums) { const n = nums.length; const leftSum = Array(n).fill(0); const rightSum = Array(n).fill(0); for (let i = 1; i < n; i++) { leftSum[i] = leftSum[i-1] + nums[i-1]; rightSum[n-i-1] = rightSum[n-i] + nums[n-i]; } return nums.map((num, i) => Math.abs(leftSum[i] - rightSum[i])); }; ```