Initial commit
This commit is contained in:
commit
8c3ca7a910
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.idea
|
||||||
27
01/binarySearch.js
Normal file
27
01/binarySearch.js
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
const binarySearch = (list, item) => {
|
||||||
|
let startIndex = 0;
|
||||||
|
let endIndex = list.length - 1;
|
||||||
|
|
||||||
|
while (startIndex <= endIndex) {
|
||||||
|
let midIndex = Math.floor((startIndex + endIndex) / 2);
|
||||||
|
const candidate = list[midIndex];
|
||||||
|
|
||||||
|
if (candidate === item) {
|
||||||
|
console.log(`Item ${item} found at index ${midIndex}`);
|
||||||
|
return midIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (candidate > item) {
|
||||||
|
endIndex = midIndex - 1;
|
||||||
|
} else {
|
||||||
|
startIndex = midIndex + 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log(`Not found "${item}"`);
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
const list = [10, 20, 30, 50, 80, 100, 500];
|
||||||
|
binarySearch(list, 20); // 1
|
||||||
|
binarySearch(list, 40); // null
|
||||||
18
01/simpleSearch.js
Normal file
18
01/simpleSearch.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
const simpleSearch = (list, item) => {
|
||||||
|
for (let i = 0; i <= list.length; i++) {
|
||||||
|
const candidate = list[i];
|
||||||
|
if (candidate === item) {
|
||||||
|
console.log(`Item ${item} found at index ${i}`);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`Not found "${item}"`);
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const list = [10, 20, 30, 50, 80, 100, 500];
|
||||||
|
|
||||||
|
simpleSearch(list, 20); // 1
|
||||||
|
simpleSearch(list, 40); // null
|
||||||
47
02/selectionSort.js
Normal file
47
02/selectionSort.js
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
const findSmallestIndex = (arr) => {
|
||||||
|
let smallestValue = arr[0];
|
||||||
|
let smallestIndex = 0;
|
||||||
|
|
||||||
|
for (let i = 1; i < arr.length; i++) {
|
||||||
|
const candidate = arr[i];
|
||||||
|
if (candidate < smallestValue) {
|
||||||
|
smallestIndex = i;
|
||||||
|
smallestValue = candidate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return smallestIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectionSort = (arr) => {
|
||||||
|
const result = [];
|
||||||
|
const copyArr = [...arr];
|
||||||
|
|
||||||
|
for (let i = 0; i < arr.length; i++) {
|
||||||
|
const smallestIndex = findSmallestIndex(copyArr);
|
||||||
|
const smallestValue = copyArr.splice(smallestIndex, 1)[0];
|
||||||
|
result.push(smallestValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
const recursiveSelectionSort = array => {
|
||||||
|
if (!array.length) return [];
|
||||||
|
|
||||||
|
const copyArr = [...array];
|
||||||
|
const smallestIndex = findSmallestIndex(copyArr);
|
||||||
|
|
||||||
|
return [
|
||||||
|
...copyArr.splice(smallestIndex, 1),
|
||||||
|
...recursiveSelectionSort(copyArr),
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
const array = [2, 4, 5, 1, 6, 3];
|
||||||
|
const sorted = selectionSort(array);
|
||||||
|
const sorted2 = recursiveSelectionSort(array);
|
||||||
|
|
||||||
|
console.log('array', array);
|
||||||
|
console.log('sorted array', sorted);
|
||||||
|
console.log('recursive sorted array', sorted2);
|
||||||
10
03/counter.js
Normal file
10
03/counter.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
const counter = (val) => {
|
||||||
|
if (val < 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(val);
|
||||||
|
counter(val - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
counter(5);
|
||||||
11
04/max_item.js
Normal file
11
04/max_item.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
const max_item = (arr) => {
|
||||||
|
if (arr.length < 2) {
|
||||||
|
return arr[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return Math.max(arr[0], max_item(arr.slice(1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = max_item([999, 1, 2, 8, 3, 4, 5]);
|
||||||
|
console.log('res', res);
|
||||||
23
04/quick_sort.js
Normal file
23
04/quick_sort.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
const quick_sort = (arr) => {
|
||||||
|
if (arr.length < 2) {
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
const pivot = arr[0];
|
||||||
|
const less = [];
|
||||||
|
const greater = [];
|
||||||
|
|
||||||
|
for (let i = 1; i < arr.length; i++) {
|
||||||
|
const candidate = arr[i];
|
||||||
|
if (candidate < pivot) {
|
||||||
|
less.push(candidate)
|
||||||
|
} else {
|
||||||
|
greater.push(candidate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return [quick_sort(less), pivot, quick_sort(greater)].flat();
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = quick_sort([1, 234, 21, 4, 211, 4, 63, 12, 84, 2])
|
||||||
|
console.log('res', res);
|
||||||
10
04/sum.js
Normal file
10
04/sum.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
const sum = (arr) => {
|
||||||
|
if (arr.length < 2) {
|
||||||
|
return arr[0] || 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr[0] + sum(arr.slice(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = sum([1, 2, 3, 4, 5, 6, 8])
|
||||||
|
console.log('res', res);
|
||||||
17
05/check_voter.js
Normal file
17
05/check_voter.js
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
const voter = {};
|
||||||
|
const checkVoter = (vote) => {
|
||||||
|
if (voter[vote]) {
|
||||||
|
console.log('Duplicate', vote);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
voter[vote] = true;
|
||||||
|
console.log('Success Vote', vote);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
checkVoter('Mike');
|
||||||
|
checkVoter('Jack');
|
||||||
|
checkVoter('John');
|
||||||
|
checkVoter('Mike');
|
||||||
39
06/bfs.js
Normal file
39
06/bfs.js
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
const breadthFirstSearch = (graph, start, end) => {
|
||||||
|
const queue = graph[start];
|
||||||
|
const checked = [];
|
||||||
|
|
||||||
|
let lastLevelElement = queue[queue.length - 1];
|
||||||
|
let level = 1;
|
||||||
|
|
||||||
|
|
||||||
|
while (queue.length) {
|
||||||
|
const candidate = queue.shift();
|
||||||
|
|
||||||
|
if (candidate === end) {
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (checked.includes(candidate)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
queue.push(...(graph[candidate] || []));
|
||||||
|
if (candidate === lastLevelElement) {
|
||||||
|
lastLevelElement = queue[queue.length - 1];
|
||||||
|
level += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const graph = {
|
||||||
|
a: ['b', 'c', 'd'],
|
||||||
|
b: ['e', 'f'],
|
||||||
|
d: ['e', 'g'],
|
||||||
|
c: ['j', 'k'],
|
||||||
|
e: ['l']
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = breadthFirstSearch(graph, 'a', 'l');
|
||||||
|
console.log('res', res);
|
||||||
97
09/dijkstra.js
Normal file
97
09/dijkstra.js
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
// 1) Найти самый дешевый узел из необработанных
|
||||||
|
// 2) Проверить минимальный путь до его соседей и обновить стоимость и родителя
|
||||||
|
// 3) Пометить узел как обработанный
|
||||||
|
// 4) Продолжать пока все узлы не будут обработаны
|
||||||
|
// 5) Вернуть итоговую стоимость и путь
|
||||||
|
|
||||||
|
const findLowestCostNode = (costs, processed) => {
|
||||||
|
let lowestCost = Infinity;
|
||||||
|
let lowestCostNode = null;
|
||||||
|
|
||||||
|
Object.entries(costs).forEach(([node, cost]) => {
|
||||||
|
if (!processed.includes(node) && cost < lowestCost) {
|
||||||
|
lowestCost = cost;
|
||||||
|
lowestCostNode = node;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return lowestCostNode;
|
||||||
|
};
|
||||||
|
|
||||||
|
const dejsktra = (graph, [from, to]) => {
|
||||||
|
const costs = {
|
||||||
|
[to]: Infinity,
|
||||||
|
...graph[from],
|
||||||
|
};
|
||||||
|
|
||||||
|
const parents = {};
|
||||||
|
Object.keys(graph[from]).forEach(key => parents[key] = from);
|
||||||
|
|
||||||
|
const processed = [];
|
||||||
|
|
||||||
|
let lowestCostNode = from;
|
||||||
|
while(lowestCostNode) {
|
||||||
|
const neighbours = graph[lowestCostNode] || {};
|
||||||
|
Object.keys(neighbours).forEach(neighbour => {
|
||||||
|
let cost = costs[lowestCostNode] + neighbours[neighbour];
|
||||||
|
|
||||||
|
if (!costs[neighbour]) {
|
||||||
|
costs[neighbour] = Infinity;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cost < costs[neighbour]) {
|
||||||
|
costs[neighbour] = cost;
|
||||||
|
parents[neighbour] = lowestCostNode;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
processed.push(lowestCostNode);
|
||||||
|
lowestCostNode = findLowestCostNode(costs, processed);
|
||||||
|
}
|
||||||
|
|
||||||
|
const path = [to];
|
||||||
|
let parent = parents[to];
|
||||||
|
|
||||||
|
while (parent) {
|
||||||
|
path.push(parent);
|
||||||
|
parent = parents[parent];
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
value: costs[to],
|
||||||
|
path: path.reverse()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const testGraph = {
|
||||||
|
a: { b: 2, f: 6 },
|
||||||
|
b: { c: 4 },
|
||||||
|
c: { d: 8, g: 6 },
|
||||||
|
d: { h: 3 },
|
||||||
|
e: { b: 1, g: 5, },
|
||||||
|
f: { e: 1, g: 7 },
|
||||||
|
g: { d: 2, h: 4, j: 2,},
|
||||||
|
h: { j: 1 },
|
||||||
|
};
|
||||||
|
|
||||||
|
const complexGraph = {
|
||||||
|
a: { b: 4, c: 2, d: 7 },
|
||||||
|
b: { e: 3, f: 1, g: 5 },
|
||||||
|
c: { f: 4, h: 2 },
|
||||||
|
d: { h: 6, i: 3 },
|
||||||
|
e: { j: 2, k: 4 },
|
||||||
|
f: { j: 5, l: 2 },
|
||||||
|
g: { k: 3, m: 4 },
|
||||||
|
h: { l: 5, n: 2 },
|
||||||
|
i: { n: 4, o: 3 },
|
||||||
|
j: { m: 1, n: 6 },
|
||||||
|
k: { n: 2, o: 5 },
|
||||||
|
l: { o: 4 },
|
||||||
|
m: { o: 3 },
|
||||||
|
n: { o: 2 },
|
||||||
|
o: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
console.log(dejsktra(testGraph, ['a', 'j'])); // { value: 14, path: [ 'a', 'b', 'c', 'g', 'j' ] }
|
||||||
|
console.log(dejsktra(complexGraph, ['a', 'o'])); // { value: 8, path: [ 'a', 'c', 'h', 'n', 'o' ] }
|
||||||
37
10/greedy.js
Normal file
37
10/greedy.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// Найти непокрытые штаты
|
||||||
|
// Выбрать странцию покрывающую больше всех штатов из непокрытых
|
||||||
|
|
||||||
|
const findStations = (allStationLst, needStateList) => {
|
||||||
|
let needed = new Set([...needStateList]);
|
||||||
|
let result = new Set();
|
||||||
|
|
||||||
|
while (needed.size > 0) {
|
||||||
|
let statesCovered = new Set();
|
||||||
|
let stationCandidate;
|
||||||
|
|
||||||
|
Object.keys(allStationLst).forEach((station) => {
|
||||||
|
const stationStateCovered = new Set([...allStationLst[station]].filter(item => needed.has(item)));
|
||||||
|
if (stationStateCovered.size > statesCovered.size) {
|
||||||
|
statesCovered = stationStateCovered;
|
||||||
|
stationCandidate = station;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
result.add(stationCandidate);
|
||||||
|
needed = new Set([...needed].filter(item => !statesCovered.has(item)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
};
|
||||||
|
|
||||||
|
const needStateList = new Set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"]);
|
||||||
|
const stations = {
|
||||||
|
kone: new Set(["id", "nv", "ut"]),
|
||||||
|
ktwo: new Set(["wa", "id", "mt"]),
|
||||||
|
kthree: new Set(["or", "nv", "ca"]),
|
||||||
|
kfour: new Set(["nv", "ut"]),
|
||||||
|
kfive: new Set(["ca", "az"]),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
console.log(findStations(stations, needStateList));
|
||||||
63
11/dynamic.js
Normal file
63
11/dynamic.js
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
// 1) составить матрицу из 0
|
||||||
|
// 2) если буква на i месте не совпадают, то 0
|
||||||
|
// 3) если совпадают, то берется значение из предыдущей ячейки и увеличивается на 1
|
||||||
|
// 4) обновляется максимальная подстрока
|
||||||
|
|
||||||
|
|
||||||
|
const createMatrix = (row, col) => {
|
||||||
|
const arr = Array(row).fill(Array(col).fill(0));
|
||||||
|
return JSON.parse(JSON.stringify(arr));
|
||||||
|
}
|
||||||
|
|
||||||
|
const maxCommonSubstring = (str1, str2) => {
|
||||||
|
const matrix = createMatrix(str1.length, str2.length);
|
||||||
|
|
||||||
|
let maxSize = 0;
|
||||||
|
let endIndex = 0;
|
||||||
|
|
||||||
|
for (let i = 0; i < str1.length; i++) {
|
||||||
|
for (let j = 0; j < str2.length; j++) {
|
||||||
|
if (str1[i] !== str2[j]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
matrix[i][j] = (i && j) > 0 ? matrix[i - 1][j - 1] + 1 : 1;
|
||||||
|
|
||||||
|
if (matrix[i][j] >= maxSize) {
|
||||||
|
maxSize = matrix[i][j];
|
||||||
|
endIndex = j + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return str1.slice(endIndex - maxSize, endIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
maxCommonSubstring('fish', 'hish'); // 'ish'
|
||||||
|
maxCommonSubstring('fish', 'fista'); // 'fis'
|
||||||
|
maxCommonSubstring('fish', 'fista'); // 'is'
|
||||||
|
|
||||||
|
|
||||||
|
const maxCommonSubsequence = (str1, str2) => {
|
||||||
|
const matrix = createMatrix(str1.length, str2.length);
|
||||||
|
|
||||||
|
for (let i = 0; i < str1.length; i++) {
|
||||||
|
for (let j = 0; j < str2.length; j++) {
|
||||||
|
if (str1[i] === str2[j]) {
|
||||||
|
matrix[i][j] = (i && j) > 0 ? matrix[i - 1][j - 1] + 1 : 1;
|
||||||
|
} else {
|
||||||
|
const left = i > 0 ? matrix[i - 1][j] : 0;
|
||||||
|
const up = j > 0 ? matrix[i][j - 1] : 0
|
||||||
|
|
||||||
|
matrix[i][j] = Math.max(left, up);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return matrix[str1.length - 1][str2.length - 1]
|
||||||
|
}
|
||||||
|
|
||||||
|
maxCommonSubsequence('fort', 'fosh'); // 2
|
||||||
|
maxCommonSubsequence('fish', 'fosh'); // 3
|
||||||
Loading…
x
Reference in New Issue
Block a user