Cassidoo Week #174
Here is the interview question of cassidoo newsletter #174:
Given a list of folders in a filesystem and the name of a folder to remove, return the new list of folders after removal.
Examples:
$ removeFolder(['/a', '/a/b', '/c/d', '/c/d/e', '/c/f', '/c/f/g'], 'c')
$ ['/a', '/a/b']
$ removeFolder(['/a', '/a/b', '/c/d', '/c/d/e', '/c/f', '/c/f/g'], 'd')
$ ['/a', '/a/b', '/c', '/c/f', '/c/f/g']
This one is easier than the question of the previous week and the general idea is this one:
- For each folder:
- Truncate folder: keep only the part before the folder being removed
- Returns that result
- Store each result in a set, so I don’t have to worry about duplications.
Note that in my algorithm below, I suppose that the second parameter is always a “single” folder, for exemple c
but not c/d
.
In a “real” interview, that is probably a question to ask: the global idea remains, but the implementation would be a little different!
Here is my solution in JS:
function removeFolder(folders, toRemove) {
const results = new Set();
for (let i = 0; i < folders.length; ++i) {
const truncatedFolder = truncate(folders[i], toRemove);
if (truncatedFolder) {
results.add(truncatedFolder);
}
}
return Array.from(results);
}
function truncate(folder, toRemove) {
const parts = folder.split('/');
const results = [];
for (let i = 0; i < parts.length; ++i) {
const part = parts[i];
if (part === toRemove) {
// This folder is deleted, we can stop here
// since everything after will be deleted
break;
}
results.push(part);
}
return results.join('/');
}