Start learning free

LESSON 391 OF 415 · PROJECTS: COMMAND-LINE TOOLS

CLI Tool: uniq v2 — Count Adjacent Runs in Swift

Practice

Build a version of the Unix uniq -c command. Given a list of lines, collapse each run of adjacent duplicates into a single output line that shows the run's count followed by the value.

Each output line is formatted as String(format: "%7d ", count) + value: a 7-character right-aligned count, a single space, then the line value. Join all output lines with \n.

Function signature:

func uniqCount(_ lines: [String]) -> String

Example:

Input: lines = ["a", "a", "b", "c", "c", "c"]

Output (when printed):
      2 a
      1 b
      3 c

The first run is two "a"s, then a single "b", then three "c"s — three output lines.


Track var prev and var count. When a NEW value comes in (or you reach end), flush the previous run with String(format: "%7d ", count) + prev and reset.

Don't forget to flush AFTER the loop too. Use == for the string comparison.
if count > 0 && lines[i] == prev {
    count += 1
} else {
    if count > 0 {
        result.append(String(format: "%7d ", count) + prev)
    }
    prev = lines[i]
    count = 1
}


The full solution:
class Solution {
    func uniqCount(_ lines: [String]) -> String {
        var result = [String]()
        var count = 0
        var prev = ""
        for i in 0..<lines.count {
            if count > 0 && lines[i] == prev {
                count += 1
            } else {
                if count > 0 {
                    result.append(String(format: "%7d ", count) + prev)
                }
                prev = lines[i]
                count = 1
            }
        }
        if count > 0 {
            result.append(String(format: "%7d ", count) + prev)
        }
        return result.joined(separator: "\n")
    }
}

STEP 1 OF 13
    Ctrl + Enter to check

    Uniq V2 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