Start learning free

LESSON 195 OF 414 · NESTED LOOPS

Top K Brands V6 - Tie-Break by Review Count in Scala

Practice

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:

        val brands = Array("TechPro", "MegaCorp", "NeoByte", "Quantum", "Zenith")
        val ratings = Array(4, 5, 5, 3, 4)
        val reviews = Array(200, 150, 500, 100, 300)
        val 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).
  • k is 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 println(...).

Start from v4: the same val used = Array.fill(ratings.size)(false) and val lines = scala.collection.mutable.ArrayBuffer[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.

        val brands = Array("TechPro", "MegaCorp", "NeoByte", "Quantum", "Zenith")
        val ratings = Array(4, 5, 5, 3, 4)
        val reviews = Array(200, 150, 500, 100, 300)
        val k = 3

        val used = Array.fill(ratings.size)(false)
        val lines = scala.collection.mutable.ArrayBuffer[String]()
        for (rank <- 1 to k) {
            var bestIndex = -1
            for (i <- ratings.indices) {
                if (!used(i)) {
                    if (bestIndex == -1) {
                        bestIndex = i
                    }
                    else if (ratings(i) > ratings(bestIndex)) {
                        bestIndex = i
                    }
                    else if (ratings(i) == ratings(bestIndex) && reviews(i) > reviews(bestIndex)) {
                        bestIndex = i
                    }
                }
            }
            used(bestIndex) = true
            lines.append(s"$rank. ${brands(bestIndex)} (${ratings(bestIndex)}, ${reviews(bestIndex)})")
        }
        println(lines.mkString("\n"))

STEP 1 OF 12
    Ctrl + Enter to check

    Top K Brands V6 in Scala

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