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")
}
}
Free plan: 30 tutor messages. Premium is unlimited.
