Tidy up a file path
A storage service is handed paths with stray slashes and dot segments in them, and stores exactly one canonical form.
- Segments are separated by slashes; runs of slashes count as one.
- A "." segment means "here" and is dropped.
- A ".." segment climbs one level; at the root it does nothing.
- The result starts with a slash and, apart from the root, does not end with one.
- The root itself is a single slash.
tidyPath(raw: string) → string
Java needs a compiler and Drill does not host one yet, so this page is the reference rather than an exercise: the problem, worked examples, and the solution in full. To type it out, the same problem runs in Python.
Where you start
String tidyPath(String raw) {
}
Worked examples
| Call | Result |
|---|---|
tidyPath("/home//user/") | "/home/user" |
tidyPath("/a/./b/../c") | "/a/c" |
tidyPath("/../") | "/" |
tidyPath("/") | "/" |
Hint
Split on the slash and push each real segment onto a stack; ".." pops instead. Joining the stack back up gives the answer.
Reference solution in Java
String tidyPath(String raw) {
List<String> kept = new ArrayList<>();
for (String part : raw.split("/")) {
if (part.isEmpty() || part.equals(".")) continue;
if (part.equals("..")) {
if (!kept.isEmpty()) kept.remove(kept.size() - 1);
} else {
kept.add(part);
}
}
return "/" + String.join("/", kept);
}