Start learning free

LESSON 381 OF 415 · PROJECTS: COMMAND-LINE TOOLS

CLI Tool: head v4 — Negative n drops the tail in Swift

Practice

Same signature as v2/v3, but now n may be negative. Real head -n -K prints all lines except the last K. So when n < 0 return all lines except the last |n|; when n ≥ 0 behave exactly like v3 (return the first n, capped at the input length). If |n| is at least the number of lines, nothing is left, so return the empty string.

Function signature:

func head(_ lines: [String], _ n: Int) -> String

Example (negative n):

Input: lines = ["a", "b", "c", "d", "e"], n = -2

Output: "a\nb\nc"

When printed:
a
b
c

Swift's range slice needs an explicit, non-negative end index. Branch on the sign of n: when n < 0, the end index is lines.count + n; otherwise it's min(n, lines.count). Don't forget max(0, ...) for the negative branch in case |n| exceeds the array length.

let end: Int
if n < 0 {
    end = max(0, lines.count + n)
} else {
    end = min(n, lines.count)
}
return lines[0..<end].joined(separator: "\n")


The full solution:
class Solution {
    func head(_ lines: [String], _ n: Int) -> String {
        let end: Int
        if n < 0 {
            end = max(0, lines.count + n)
        } else {
            end = min(n, lines.count)
        }
        return lines[0..<end].joined(separator: "\n")
    }
}

STEP 1 OF 5
    Ctrl + Enter to check

    Head V4 in Swift

    Keep going with SwiftAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free