Rank the top k brands by rating, breaking ties with the review count. This builds on v4's repeated search (not on v5: there is no filtering here); only the comparison gets a second criterion.
You start with:
let brands = ["TechPro", "MegaCorp", "NeoByte", "Quantum", "Zenith"]
let ratings = [4, 5, 5, 3, 4]
let reviews = [200, 150, 500, 100, 300]
let k = 3
Build:
1. NeoByte (5, 500) 2. MegaCorp (5, 150) 3. Zenith (4, 300)
Rules:
- Rating decides first: the higher rating wins.
- If two brands have the same rating, the one with more reviews wins.
- If rating and reviews are both equal, the one listed first wins (the test data has no such pair, but your code must follow the rule).
kis never larger than the number of brands.- Each line is
"rank. Brand (rating, reviews)", starting at rank 1. - Print the lines, one per line, with
print(...).
Start from v4: the same
var used = Array(repeating: false, count: ratings.count) and var lines = [String](), the same two loops. Only the comparison inside the inner loop changes.
Use a chain (if / else if / else if): no candidate yet, take this one; else a higher rating, take this one; else the same rating and more reviews, take this one.
let brands = ["TechPro", "MegaCorp", "NeoByte", "Quantum", "Zenith"]
let ratings = [4, 5, 5, 3, 4]
let reviews = [200, 150, 500, 100, 300]
let k = 3
var used = Array(repeating: false, count: ratings.count)
var lines = [String]()
for rank in 1...k {
var bestIndex = -1
for index in ratings.indices {
if !used[index] {
if bestIndex == -1 {
bestIndex = index
} else if ratings[index] > ratings[bestIndex] {
bestIndex = index
} else if ratings[index] == ratings[bestIndex] && reviews[index] > reviews[bestIndex] {
bestIndex = index
}
}
}
used[bestIndex] = true
lines.append("\(rank). \(brands[bestIndex]) (\(ratings[bestIndex]), \(reviews[bestIndex]))")
}
print(lines.joined(separator: "\n"))
Free plan: 30 tutor messages. Premium is unlimited.
Saved
Ctrl + Enter to check
