Skip to content
Open
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
79 changes: 66 additions & 13 deletions lib/exercises.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
// This method will return an array of arrays.
// Each subarray will have strings which are anagrams of each other
// Time Complexity: ?
// Space Complexity: ?
// Time Complexity: O(n log n), where n is the combined length of the input strings (since the strings are being sorted)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But you're not sorting an array of all the characters in all the strings.

Instead I would say that the time complexity is O(n * m log m), where n is the number of strings and m is the length of the largest string. If you could assume the all the strings were less than a certain number of characters you could then say it's O(n).

// Space Complexity: O(n), where n is the length of the input array.
function grouped_anagrams(strings) {
throw new Error("Method hasn't been implemented yet!");
}
const indexHash = {};
strings.forEach ((string) => {
const tempString = string.split('').sort().join('');
if (!indexHash[tempString]) {
indexHash[tempString] = [string];
} else {
indexHash[tempString].push(string);
}
})

const returnArray = []

// This method will return the k most common elements
// in the case of a tie it will select the first occuring element.
// Time Complexity: ?
// Space Complexity: ?
function top_k_frequent_elements(list, k) {
throw new Error("Method hasn't been implemented yet!");
for (let key in indexHash) {
returnArray.push(indexHash[key])
}
return returnArray;
}


Expand All @@ -20,10 +27,56 @@ function top_k_frequent_elements(list, k) {
// Each element can either be a ".", or a digit 1-9
// The same digit cannot appear twice or more in the same
// row, column or 3x3 subgrid
// Time Complexity: ?
// Space Complexity: ?
// Time Complexity: O(n), where n is the number of elements in the sudoku table

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would say instead O(n2) where n is the length of a side of the sudoku table.

// Space Complexity: O(n), where n is the number of elements in the sudoku table
function valid_sudoku(table) {
throw new Error("Method hasn't been implemented yet!");
// check rows

for (let row = 0; row < table.length; row++) {
const rowHash = {};
for (let i = 0; i < table[row].length; i++) {
let char = table[row][i]
if (char !== ".") {
if (rowHash[char]) {
return false;
}
rowHash[char] = 1;
}
}
}

for (let i = 0; i < table[0].length; i++) {
const colHash = {};
for (let col = 0; col < table.length; col++) {
let char = table[col][i];
if (char !== '.') {
if (colHash[char]) {
return false;
}
colHash[char] = 1;
}
}
}

const subboxes = [[0, 1, 2], [3, 4, 5], [6, 7, 8]];

for (let counter1 = 0; counter1 < 3; counter1++) {
for (let counter2 = 0; counter2 < 3; counter2++) {
const subboxHash = {};
for (let counter3 = 0; counter3 < 3; counter3++) {
for (let counter4 = 0; counter4 < 3; counter4++) {
let char = table[subboxes[counter1][counter3]][subboxes[counter2][counter4]];
if (char !== '.') {
if (subboxHash[char]) {
return false;
}
subboxHash[char] = 1;
}
}
}
}
}
return true;
}

module.exports = {
Expand Down
52 changes: 47 additions & 5 deletions test/exercises.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,49 @@ describe("exercises", function() {
});
});

describe.skip("valid sudoku", function() {
describe("valid sudoku", function() {
it("is not valid if a row has duplicate values", function() {
// Arrange
const table = [
["5","3",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".","5","5",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."]
];

// Act
const valid = valid_sudoku(table);

// Assert
expect(valid).to.be.false;
});

it("is not valid if a column has duplicate values", function() {
// Arrange
const table = [
["5",".",".",".",".",".",".",".","."],
["2",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".","4",".",".",".","."],
[".",".",".",".","4",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."]
];

// Act
const valid = valid_sudoku(table);

// Assert
expect(valid).to.be.false;
});

it("works for the table given in the README", function() {
// Arrange
const table = [
Expand All @@ -156,7 +198,7 @@ describe("exercises", function() {
const valid = valid_sudoku(table);

// Assert
expect(valid).toEqual(true);
expect(valid).to.eql(true);
});

it("fails for the table given in the README", function() {
Expand All @@ -177,7 +219,7 @@ describe("exercises", function() {
const valid = valid_sudoku(table);

// Assert
expect(valid).toEqual(false);
expect(valid).to.eql(false);
});

it("fails for a duplicate number in a sub-box", function() {
Expand All @@ -198,7 +240,7 @@ describe("exercises", function() {
const valid = valid_sudoku(table);

// Assert
expect(valid).toEqual(false);
expect(valid).to.eql(false);
});

it("fails for a duplicate number in a bottom right sub-box", function() {
Expand All @@ -219,7 +261,7 @@ describe("exercises", function() {
const valid = valid_sudoku(table);

// Assert
expect(valid).toEqual(false);
expect(valid).to.eql(false);
});
});
});