Skip to content

Commit b85eb2c

Browse files
committed
getNthFib and riverSizes
1 parent f5a5233 commit b85eb2c

7 files changed

+263
-0
lines changed

getNthFib.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// 0, 1, 2, 3, 4, 5, 6, 7, 8
2+
// 0, 0, 1, 1, 2, 3, 5, 8, 13
3+
function getNthFib(n) {
4+
if (!n || n === 1) return 0
5+
if (n <= 3) return 1
6+
7+
return getNthFib(n - 1) + getNthFib(n - 2)
8+
}
9+
10+
// Do not edit the line below.
11+
exports.getNthFib = getNthFib;
12+
13+
const test = true
14+
if (typeof test === 'boolean' && test) {
15+
const { expect } = require('../leet-code/utils.js');
16+
17+
expect(getNthFib(0) /*?*/, 0) //?.s $
18+
expect(getNthFib(1) /*?*/, 0) //?.s $
19+
expect(getNthFib(2) /*?*/, 1) //?.s $
20+
expect(getNthFib(3) /*?*/, 1) //?.s $
21+
expect(getNthFib(4) /*?*/, 2) //?.s $
22+
expect(getNthFib(5) /*?*/, 3) //?.s $
23+
expect(getNthFib(6) /*?*/, 5) //?.s $
24+
expect(getNthFib(7) /*?*/, 8) //?.s $
25+
expect(getNthFib(8) /*?*/, 13) //?.s $
26+
}

getNthFib2.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// 0, 1, 2, 3, 4, 5, 6, 7, 8
2+
// 0, 0, 1, 1, 2, 3, 5, 8, 13
3+
function getNthFib(n, memoize = {0: 0, 1: 0, 2: 1}) {
4+
if (!(n in memoize))
5+
memoize[n] = getNthFib(n - 1, memoize) + getNthFib(n - 2, memoize)
6+
7+
return memoize[n]
8+
}
9+
10+
// Do not edit the line below.
11+
exports.getNthFib = getNthFib;
12+
13+
const test = true
14+
if (typeof test === 'boolean' && test) {
15+
const { expect } = require('../leet-code/utils.js');
16+
17+
expect(getNthFib(0) /*?*/, 0) //?.s $
18+
expect(getNthFib(1) /*?*/, 0) //?.s $
19+
expect(getNthFib(2) /*?*/, 1) //?.s $
20+
expect(getNthFib(3) /*?*/, 1) //?.s $
21+
expect(getNthFib(4) /*?*/, 2) //?.s $
22+
expect(getNthFib(5) /*?*/, 3) //?.s $
23+
expect(getNthFib(6) /*?*/, 5) //?.s $
24+
expect(getNthFib(7) /*?*/, 8) //?.s $
25+
expect(getNthFib(8) /*?*/, 13) //?.s $
26+
}

getNthFib3.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// 0, 1, 2, 3, 4, 5, 6, 7, 8
2+
// 0, 0, 1, 1, 2, 3, 5, 8, 13
3+
function getNthFib(n) {
4+
if (!n || n === 1) return 0
5+
if (n <= 3) return 1
6+
7+
let prev = 1
8+
let fib = 2
9+
10+
while (--n > 3)
11+
[prev, fib] = [fib, fib + prev]
12+
13+
return fib
14+
}
15+
16+
// Do not edit the line below.
17+
exports.getNthFib = getNthFib;
18+
19+
const test = true
20+
if (typeof test === 'boolean' && test) {
21+
const { expect } = require('../leet-code/utils.js');
22+
23+
expect(getNthFib(0) /*?*/, 0) //?.s $
24+
expect(getNthFib(1) /*?*/, 0) //?.s $
25+
expect(getNthFib(2) /*?*/, 1) //?.s $
26+
expect(getNthFib(3) /*?*/, 1) //?.s $
27+
expect(getNthFib(4) /*?*/, 2) //?.s $
28+
expect(getNthFib(5) /*?*/, 3) //?.s $
29+
expect(getNthFib(6) /*?*/, 5) //?.s $
30+
expect(getNthFib(7) /*?*/, 8) //?.s $
31+
expect(getNthFib(8) /*?*/, 13) //?.s $
32+
}

getNthFib4.js

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// 0, 1, 2, 3, 4, 5, 6, 7, 8
2+
// 0, 0, 1, 1, 2, 3, 5, 8, 13
3+
function getNthFib(n) {
4+
if (!n || n === 1) return 0
5+
if (n <= 3) return 1
6+
7+
const lastTwo = [1, 2]
8+
9+
while (--n > 3)
10+
[lastTwo[0], lastTwo[1]] = [lastTwo[1], lastTwo[0] + lastTwo[1]]
11+
12+
return lastTwo[1]
13+
}
14+
15+
// Do not edit the line below.
16+
exports.getNthFib = getNthFib;
17+
18+
const test = true
19+
if (typeof test === 'boolean' && test) {
20+
const { expect } = require('../leet-code/utils.js');
21+
22+
expect(getNthFib(0) /*?*/, 0) //?.s $
23+
expect(getNthFib(1) /*?*/, 0) //?.s $
24+
expect(getNthFib(2) /*?*/, 1) //?.s $
25+
expect(getNthFib(3) /*?*/, 1) //?.s $
26+
expect(getNthFib(4) /*?*/, 2) //?.s $
27+
expect(getNthFib(5) /*?*/, 3) //?.s $
28+
expect(getNthFib(6) /*?*/, 5) //?.s $
29+
expect(getNthFib(7) /*?*/, 8) //?.s $
30+
expect(getNthFib(8) /*?*/, 13) //?.s $
31+
}

getNthFib5.js

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// 0, 1, 2, 3, 4, 5, 6, 7, 8
2+
// 0, 0, 1, 1, 2, 3, 5, 8, 13
3+
function getNthFib(n) {
4+
const lastTwo = [0, 1]
5+
6+
while (--n > 0)
7+
[lastTwo[0], lastTwo[1]] = [lastTwo[1], lastTwo[0] + lastTwo[1]]
8+
9+
return n > 1 ? lastTwo[1] : lastTwo[0]
10+
}
11+
12+
// Do not edit the line below.
13+
exports.getNthFib = getNthFib;
14+
15+
const test = true
16+
if (typeof test === 'boolean' && test) {
17+
const { expect } = require('../leet-code/utils.js');
18+
19+
expect(getNthFib(0) /*?*/, 0) //?.s $
20+
expect(getNthFib(1) /*?*/, 0) //?.s $
21+
expect(getNthFib(2) /*?*/, 1) //?.s $
22+
expect(getNthFib(3) /*?*/, 1) //?.s $
23+
expect(getNthFib(4) /*?*/, 2) //?.s $
24+
expect(getNthFib(5) /*?*/, 3) //?.s $
25+
expect(getNthFib(6) /*?*/, 5) //?.s $
26+
expect(getNthFib(7) /*?*/, 8) //?.s $
27+
expect(getNthFib(8) /*?*/, 13) //?.s $
28+
}

riverSizes.js

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
function riverSizes(matrix) {
2+
const riversSizes = [];
3+
const notVisited = new Array(matrix.length).fill(null)
4+
.map((x, i) => new Array(matrix[i].length).fill(1))
5+
const context = {
6+
m: matrix.length,
7+
n: matrix[0].length,
8+
visit: (i, j) => notVisited[i][j] = 0,
9+
validRiver: ([i, j]) => notVisited[i][j] && matrix[i][j],
10+
}
11+
12+
for (let i = 0; i < matrix.length; i++)
13+
for (let j = 0; j < matrix[i].length; j++) {
14+
if (matrix[i][j] === 0 || !notVisited[i][j]) continue
15+
riversSizes.push(traverse(context, [i, j], 1))
16+
}
17+
18+
return riversSizes
19+
}
20+
21+
function traverse(context, [i, j], length) {
22+
context.visit(i, j)
23+
const { m, n, validRiver } = context
24+
25+
if (j - 1 >= 0 && validRiver([i, j - 1])) length = traverse(context, [i, j - 1], length + 1)
26+
if (j + 1 < n && validRiver([i, j + 1])) length = traverse(context, [i, j + 1], length + 1)
27+
if (i - 1 >= 0 && validRiver([i - 1, j])) length = traverse(context, [i - 1, j], length + 1)
28+
if (i + 1 < m && validRiver([i + 1, j])) length = traverse(context, [i + 1, j], length + 1)
29+
30+
return length
31+
}
32+
33+
// Do not edit the line below.
34+
exports.riverSizes = riverSizes;
35+
const test = true
36+
if (typeof test === 'boolean' && test) {
37+
const { expect } = require('../leet-code/utils.js');
38+
console.clear()
39+
expect(riverSizes([
40+
[0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1],
41+
[1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1],
42+
]) /*?*/, [4, 18]) //?.s $
43+
expect(riverSizes([
44+
[0, 1, 0, 1, 1],
45+
[1, 1, 1, 0, 0],
46+
[1, 1, 0, 0, 1],
47+
[1, 0, 1, 1, 1],
48+
[1, 1, 1, 0, 0],
49+
]) /*?*/, [14,2]) //?.s $
50+
expect(riverSizes([
51+
[1, 0, 0, 0, 0, 0, 1],
52+
[0, 1, 0, 0, 0, 1, 0],
53+
[0, 0, 1, 0, 1, 0, 0],
54+
[0, 0, 1, 1, 1, 0, 0],
55+
[0, 0, 1, 0, 1, 0, 0],
56+
[0, 1, 0, 0, 0, 1, 0],
57+
[1, 0, 0, 0, 0, 0, 1]
58+
]) /*?*/, [1, 1, 1, 1, 7, 1, 1, 1, 1]) //?.s $
59+
}

riverSizes2.js

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
function riverSizes(matrix) {
2+
const riversSizes = [];
3+
const m = matrix.length
4+
const n = matrix[0].length
5+
const notVisited = new Array(m*n).fill(1)
6+
const context = {
7+
m,
8+
n,
9+
visit: (i, j) => notVisited[i*n + j] = 0,
10+
isNotVisited: (i, j) => notVisited[i*n + j],
11+
isValidRiver: ([i, j]) => context.isNotVisited(i, j) && matrix[i][j],
12+
}
13+
14+
for (let i = 0; i < matrix.length; i++)
15+
for (let j = 0; j < matrix[i].length; j++)
16+
if (context.isValidRiver([i, j]))
17+
riversSizes.push(traverse(context, [i, j], 1))
18+
19+
return riversSizes
20+
}
21+
22+
function traverse(context, [i, j], length) {
23+
context.visit(i, j)
24+
const { m, n, isValidRiver } = context
25+
26+
if (j - 1 >= 0 && isValidRiver([i, j - 1])) length = traverse(context, [i, j - 1], length + 1)
27+
if (j + 1 < n && isValidRiver([i, j + 1])) length = traverse(context, [i, j + 1], length + 1)
28+
if (i - 1 >= 0 && isValidRiver([i - 1, j])) length = traverse(context, [i - 1, j], length + 1)
29+
if (i + 1 < m && isValidRiver([i + 1, j])) length = traverse(context, [i + 1, j], length + 1)
30+
31+
return length
32+
}
33+
34+
// Do not edit the line below.
35+
exports.riverSizes = riverSizes;
36+
37+
const test = true
38+
if (typeof test === 'boolean' && test) {
39+
const { expect } = require('../leet-code/utils.js');
40+
console.clear()
41+
expect(riverSizes([
42+
[0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1],
43+
[1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1],
44+
]) /*?*/, [4, 18]) //?.s $
45+
expect(riverSizes([
46+
[0, 1, 0, 1, 1],
47+
[1, 1, 1, 0, 0],
48+
[1, 1, 0, 0, 1],
49+
[1, 0, 1, 1, 1],
50+
[1, 1, 1, 0, 0],
51+
]) /*?*/, [14,2]) //?.s $
52+
expect(riverSizes([
53+
[1, 0, 0, 0, 0, 0, 1],
54+
[0, 1, 0, 0, 0, 1, 0],
55+
[0, 0, 1, 0, 1, 0, 0],
56+
[0, 0, 1, 1, 1, 0, 0],
57+
[0, 0, 1, 0, 1, 0, 0],
58+
[0, 1, 0, 0, 0, 1, 0],
59+
[1, 0, 0, 0, 0, 0, 1]
60+
]) /*?*/, [1, 1, 1, 1, 7, 1, 1, 1, 1]) //?.s $
61+
}

0 commit comments

Comments
 (0)