Combine the previous three versions of wc. Given a list of lines and a mode flag, return the requested count(s) as a string. This is our own simplified interface, not the real wc flags: the real tool combines flags (such as -lw) and pads its columns with spaces.
Function signature:
func wc(_ lines: [String], _ mode: String) -> String
Mode values:
"l"→ line count, as a string."w"→ word count (whitespace-separated tokens), as a string."c"→ character count (lines only, no separating newlines), as a string."all"→lines + "\t" + words + "\t" + chars.
The "c" count is the one from v3 (the sum of the line lengths, no newlines). Any other mode value, for example "x" or "L" (modes are case-sensitive), gives the same result as "all". For an empty list, "l", "w" and "c" give "0" and "all" gives "0<TAB>0<TAB>0". The input is plain ASCII text.
Example:
Input: lines = ["hello", "world"], mode = "all" Output: "2\t2\t10"
2 lines, 2 words (one per line), 10 characters total.
Compute all three counts in a single pass through
lines, then branch on mode to pick the return value.
let numLines = lines.count
var numWords = 0
var numChars = 0
for line in lines {
let trimmed = line.trimmingCharacters(in: .whitespaces)
if !trimmed.isEmpty { numWords += trimmed.split(whereSeparator: { $0.isWhitespace }).count }
numChars += line.count
}
Then String(numLines) / String(numWords) / String(numChars) as needed, or assemble all three with tabs.
The full solution:
class Solution {
func wc(_ lines: [String], _ mode: String) -> String {
let numLines = lines.count
var numWords = 0
var numChars = 0
for line in lines {
let trimmed = line.trimmingCharacters(in: .whitespaces)
if !trimmed.isEmpty { numWords += trimmed.split(whereSeparator: { $0.isWhitespace }).count }
numChars += line.count
}
if mode == "l" { return String(numLines) }
if mode == "w" { return String(numWords) }
if mode == "c" { return String(numChars) }
return "\(numLines)\t\(numWords)\t\(numChars)"
}
}
Free plan: 30 tutor messages. Premium is unlimited.
