Skip to content

Commit 1768de7

Browse files
finnaly hard question
1 parent 886053c commit 1768de7

11 files changed

+426
-1
lines changed

Eazy/13_RomantoInteger.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/**
2+
* @param {string} s
3+
* @return {number}
4+
*/
5+
var romanToInt = function (s) {
6+
const symbols = {
7+
I: 1,
8+
V: 5,
9+
X: 10,
10+
L: 50,
11+
C: 100,
12+
D: 500,
13+
M: 1000,
14+
};
15+
16+
let left = 0,
17+
right = left + 1;
18+
const n = s.length;
19+
let sum = 0;
20+
21+
while (left < n) {
22+
if (
23+
(s[left] === "I" && (s[right] === "V" || s[right] === "X")) ||
24+
(s[left] === "X" && (s[right] === "L" || s[right] === "C")) ||
25+
(s[left] === "C" && (s[right] === "D" || s[right] === "M"))
26+
) {
27+
const re = symbols[s[right]] - symbols[s[left]];
28+
sum += re;
29+
right += 2;
30+
left += 2;
31+
} else {
32+
sum += symbols[s[left]];
33+
left++;
34+
right++;
35+
}
36+
}
37+
38+
return sum;
39+
};

Eazy/1544_MakeTheStringGreat.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* @param {string} s
3+
* @return {string}
4+
*/
5+
var makeGood = function (s) {
6+
const n = s.length;
7+
8+
if (n === 1) return s[0];
9+
10+
let rs = s.split("");
11+
let isValid = false;
12+
13+
while (!isValid) {
14+
let cnt = 0;
15+
if (rs.length === 1) {
16+
isValid = true;
17+
}
18+
19+
for (let i = 0; i < rs.length - 1; i++) {
20+
if (Math.abs(rs[i].charCodeAt(0) - rs[i + 1].charCodeAt(0)) === 32) {
21+
rs.splice(i, 2);
22+
isValid = false;
23+
cnt++;
24+
break;
25+
}
26+
}
27+
28+
if (cnt === 0) {
29+
isValid = true;
30+
}
31+
}
32+
33+
return rs.join("");
34+
};
35+
36+
export default makeGood;

Eazy/2629_FunctionComposition.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* @param {Function[]} functions
3+
* @return {Function}
4+
*/
5+
var compose = function (functions) {
6+
let currentData;
7+
return function (x) {
8+
if (functions.length <= 0) return x;
9+
10+
for (let i = functions.length - 1; i >= 0; i--) {
11+
if (!currentData) {
12+
currentData = functions[i](x);
13+
} else {
14+
currentData = functions[i](currentData)
15+
}
16+
}
17+
18+
return currentData
19+
}
20+
};
21+
22+
//OR with reduce right methods and one line of code
23+
var compose = functions => functions.length === 0 ? x => x : functions.reduceRight((prev, curr) => x => curr(prev(x)));
24+
25+
/**
26+
* const fn = compose([x => x + 1, x => 2 * x])
27+
* fn(4) // 9
28+
*/

Eazy/2665_CounterII.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* @param {integer} init
3+
* @return { increment: Function, decrement: Function, reset: Function }
4+
*/
5+
var createCounter = function (init) {
6+
let val = init;
7+
return {
8+
increment: () => ++val,
9+
decrement: () => --val,
10+
reset: () => val = init
11+
}
12+
};
13+
14+
/**
15+
* const counter = createCounter(5)
16+
* counter.increment(); // 6
17+
* counter.reset(); // 5
18+
* counter.decrement(); // 4
19+
*/
20+
21+
export default createCounter;

Eazy/2666_AllowOneFunctionCall.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* @param {Function} fn
3+
* @return {Function}
4+
*/
5+
var once = function(fn) {
6+
let cnt = 0;
7+
return function(...args){
8+
if(cnt === 0) {
9+
cnt = 1;
10+
return fn(...args);
11+
}
12+
return undefined
13+
}
14+
};
15+
16+
/**
17+
* let fn = (a,b,c) => (a + b + c)
18+
* let onceFn = once(fn)
19+
*
20+
* onceFn(1,2,3); // 6
21+
* onceFn(2,3,6); // returns undefined without calling fn
22+
*/

Eazy/27_RemoveElement.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* @param {number[]} nums
3+
* @param {number} val
4+
* @return {number}
5+
*/
6+
var removeElement = function (nums, val) {
7+
let lo = 0,
8+
hi = nums.length - 1;
9+
10+
let k = 0;
11+
12+
while (lo < hi) {
13+
if (nums[lo] === val && nums[hi] !== val) {
14+
const tmp = nums[lo];
15+
nums[lo] = nums[hi];
16+
nums[hi] = tmp;
17+
lo++;
18+
} else if (nums[lo] === val && nums[hi] === val) {
19+
hi--;
20+
} else {
21+
lo++;
22+
}
23+
}
24+
25+
for (let e of nums) {
26+
if (e !== val) {
27+
k++;
28+
}
29+
}
30+
31+
return k;
32+
};
33+
// another solution without two pointers
34+
function removeElement(nums, val) {
35+
// Counter for keeping track of elements other than val
36+
let count = 0;
37+
// Loop through all the elements of the array
38+
for (let i = 0; i < nums.length; i++) {
39+
// If the element is not val
40+
if (nums[i] !== val) {
41+
nums[count++] = nums[i];
42+
}
43+
}
44+
return count;
45+
}
46+
47+
export default removeElement;

Hard/273_IntegertoEnglishWords.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/**
2+
* @param {number} num
3+
* @return {string}
4+
*/
5+
var numberToWords = function (num) {
6+
if (num === 0) return "Zero";
7+
8+
const LOWER_THAN_20 = [
9+
"",
10+
"One",
11+
"Two",
12+
"Three",
13+
"Four",
14+
"Five",
15+
"Six",
16+
"Seven",
17+
"Eight",
18+
"Nine",
19+
"Ten",
20+
"Eleven",
21+
"Twelve",
22+
"Thirteen",
23+
"Fourteen",
24+
"Fifteen",
25+
"Sixteen",
26+
"Seventeen",
27+
"Eighteen",
28+
"Nineteen",
29+
];
30+
const LOWER_THAN_100 = [
31+
"",
32+
"Ten",
33+
"Twenty",
34+
"Thirty",
35+
"Forty",
36+
"Fifty",
37+
"Sixty",
38+
"Seventy",
39+
"Eighty",
40+
"Ninety",
41+
];
42+
43+
const helper = (num) => {
44+
if (num >= 1000000000) {
45+
return (
46+
helper(parseInt(num / 1000000000)) +
47+
" Billion" +
48+
helper(num % 1000000000)
49+
);
50+
} else if (num >= 1000000) {
51+
return (
52+
helper(parseInt(num / 1000000)) + " Million" + helper(num % 1000000)
53+
);
54+
} else if (num >= 1000) {
55+
return helper(parseInt(num / 1000)) + " Thousand" + helper(num % 1000);
56+
} else if (num >= 100) {
57+
return helper(parseInt(num / 100)) + " Hundred" + helper(num % 100);
58+
} else if (num >= 20) {
59+
return " " + LOWER_THAN_100[parseInt(num / 10)] + helper(num % 10);
60+
} else if (num > 0) {
61+
return " " + LOWER_THAN_20[parseInt(num)];
62+
} else {
63+
return "";
64+
}
65+
};
66+
67+
return helper(num).trim();
68+
};
69+
70+
export default numberToWords;

Medium/12_IntegertoRoman.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* @param {number} num
3+
* @return {string}
4+
*/
5+
var intToRoman = function (num) {
6+
const symbols = {
7+
1: "I",
8+
5: "V",
9+
10: "X",
10+
50: "L",
11+
100: "C",
12+
500: "D",
13+
1000: "M",
14+
4: "IV",
15+
9: "IX",
16+
40: "XL",
17+
90: "XC",
18+
400: "CD",
19+
900: "CM",
20+
};
21+
22+
let roman = "";
23+
let cal = num;
24+
25+
while (cal > 0) {
26+
const div = cal - (cal % 10 ** ((Math.log(cal) * Math.LOG10E + 1 | 0) - 1));
27+
if (!symbols[div]) {
28+
let cnt = div;
29+
let leftOver = div;
30+
while (leftOver > 0) {
31+
if (symbols[cnt]) {
32+
roman += symbols[cnt];
33+
leftOver -= cnt;
34+
cnt = leftOver;
35+
} else {
36+
cnt--;
37+
}
38+
}
39+
} else {
40+
roman += symbols[div];
41+
}
42+
43+
cal = cal % 10 ** ((Math.log(cal) * Math.LOG10E + 1 | 0) - 1);
44+
}
45+
46+
return roman;
47+
};
48+
49+
export default intToRoman;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// my stupid solution
2+
/**
3+
* @param {string} s
4+
* @return {number}
5+
*/
6+
var lengthOfLongestSubstring = function (s) {
7+
let left = 0,
8+
right = 0;
9+
let longestLength = 0;
10+
const n = s.length;
11+
let lettersMap = new Map();
12+
13+
while (right <= n) {
14+
if (isNaN(lettersMap.get(s[right]))) {
15+
lettersMap.set(s[right], 1);
16+
} else {
17+
if (right - left > longestLength) {
18+
longestLength = right - left;
19+
}
20+
let newMap = Array.from(lettersMap);
21+
newMap.splice(0, right + 1);
22+
lettersMap = new Map(newMap);
23+
left = left + 1;
24+
right = left;
25+
lettersMap.set(s[left], 1);
26+
}
27+
if (right === n) {
28+
if (right - left > longestLength) {
29+
longestLength = right - left;
30+
}
31+
}
32+
right++;
33+
}
34+
35+
return longestLength;
36+
};

0 commit comments

Comments
 (0)