Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Build confidence with an intuition-first walkthrough focused on array fundamentals.
The Leetcode file system keeps a log each time some user performs a change folder operation.
The operations are described below:
"../" : Move to the parent folder of the current folder. (If you are already in the main folder, remain in the same folder)."./" : Remain in the same folder."x/" : Move to the child folder named x (This folder is guaranteed to always exist).You are given a list of strings logs where logs[i] is the operation performed by the user at the ith step.
The file system starts in the main folder, then the operations in logs are performed.
Return the minimum number of operations needed to go back to the main folder after the change folder operations.
Example 1:
Input: logs = ["d1/","d2/","../","d21/","./"] Output: 2 Explanation: Use this change folder operation "../" 2 times and go back to the main folder.
Example 2:
Input: logs = ["d1/","d2/","./","d3/","../","d31/"] Output: 3
Example 3:
Input: logs = ["d1/","../","../","../"] Output: 0
Constraints:
1 <= logs.length <= 1032 <= logs[i].length <= 10logs[i] contains lowercase English letters, digits, '.', and '/'.logs[i] follows the format described in the statement.Problem summary: The Leetcode file system keeps a log each time some user performs a change folder operation. The operations are described below: "../" : Move to the parent folder of the current folder. (If you are already in the main folder, remain in the same folder). "./" : Remain in the same folder. "x/" : Move to the child folder named x (This folder is guaranteed to always exist). You are given a list of strings logs where logs[i] is the operation performed by the user at the ith step. The file system starts in the main folder, then the operations in logs are performed. Return the minimum number of operations needed to go back to the main folder after the change folder operations.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array · Stack
["d1/","d2/","../","d21/","./"]
["d1/","d2/","./","d3/","../","d31/"]
["d1/","../","../","../"]
baseball-game)backspace-string-compare)Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1598: Crawler Log Folder
class Solution {
public int minOperations(String[] logs) {
int ans = 0;
for (var v : logs) {
if ("../".equals(v)) {
ans = Math.max(0, ans - 1);
} else if (v.charAt(0) != '.') {
++ans;
}
}
return ans;
}
}
// Accepted solution for LeetCode #1598: Crawler Log Folder
func minOperations(logs []string) int {
ans := 0
for _, v := range logs {
if v == "../" {
if ans > 0 {
ans--
}
} else if v[0] != '.' {
ans++
}
}
return ans
}
# Accepted solution for LeetCode #1598: Crawler Log Folder
class Solution:
def minOperations(self, logs: List[str]) -> int:
ans = 0
for v in logs:
if v == "../":
ans = max(0, ans - 1)
elif v[0] != ".":
ans += 1
return ans
// Accepted solution for LeetCode #1598: Crawler Log Folder
impl Solution {
pub fn min_operations(logs: Vec<String>) -> i32 {
let mut depth = 0;
for log in logs.iter() {
if log == "../" {
depth = (0).max(depth - 1);
} else if log != "./" {
depth += 1;
}
}
depth
}
}
// Accepted solution for LeetCode #1598: Crawler Log Folder
function minOperations(logs: string[]): number {
let ans = 0;
for (const x of logs) {
if (x === '../') {
ans && ans--;
} else if (x !== './') {
ans++;
}
}
return ans;
}
Use this to step through a reusable interview workflow for this problem.
For each element, scan left (or right) to find the next greater/smaller element. The inner scan can visit up to n elements per outer iteration, giving O(n²) total comparisons. No extra space needed beyond loop variables.
Each element is pushed onto the stack at most once and popped at most once, giving 2n total operations = O(n). The stack itself holds at most n elements in the worst case. The key insight: amortized O(1) per element despite the inner while-loop.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Wrong move: Pushing without popping stale elements invalidates next-greater/next-smaller logic.
Usually fails on: Indices point to blocked elements and outputs shift.
Fix: Pop while invariant is violated before pushing current element.