You are given N counters, initially set to 0, and you have two possible operations on them:
- increase(X) − counter X is increased by 1,
- max counter − all counters are set to the maximum value of any counter.
A non-empty array A of M integers is given. This array represents consecutive operations:
- if A[K] = X, such that 1 ≤ X ≤ N, then operation K is increase(X),
- if A[K] = N + 1 then operation K is max counter.
For example, given integer N = 5 and array A such that:
A[0] = 3 A[1] = 4 A[2] = 4 A[3] = 6 A[4] = 1 A[5] = 4 A[6] = 4the values of the counters after each consecutive operation will be:
(0, 0, 1, 0, 0) (0, 0, 1, 1, 0) (0, 0, 1, 2, 0) (2, 2, 2, 2, 2) (3, 2, 2, 2, 2) (3, 2, 2, 3, 2) (3, 2, 2, 4, 2)The goal is to calculate the value of every counter after all operations.
Write a function:
object Solution { def solution(n: Int, a: Array[Int]): Array[Int] }
that, given an integer N and a non-empty array A consisting of M integers, returns a sequence of integers representing the values of the counters.
Result array should be returned as an array of integers.
For example, given:
A[0] = 3 A[1] = 4 A[2] = 4 A[3] = 6 A[4] = 1 A[5] = 4 A[6] = 4the function should return [3, 2, 2, 4, 2], as explained above.
Write an efficient algorithm for the following assumptions:
- N and M are integers within the range [1..100,000];
- each element of array A is an integer within the range [1..N + 1].
import scala.collection.JavaConversions._
// you can use println for debugging purposes, e.g.
// println("this is a debug message")
object Solution {
def solution(N: Int, A: Array[Int]): Array[Int] = {
@scala.annotation.tailrec
def loop(index: Int, counters: Map[Int, Int], floor: Int): Array[Int] = {
if (index >= A.length) {
Array.fill(0)(N)
} else {
loop(index = 1, counters, foor)
}
}
loop(0, Map.empty, 0)
}
}
Solution.scala:13: error: not found: value foor loop(index = 1, counters, foor) ^ one error found
import scala.collection.JavaConversions._
// you can use println for debugging purposes, e.g.
// println("this is a debug message")
object Solution {
def solution(N: Int, A: Array[Int]): Array[Int] = {
@scala.annotation.tailrec
def loop(index: Int, counters: Map[Int, Int], floor: Int): Array[Int] = {
if (index >= A.length) {
Array.fill(0)(N)
} else {
loop(index = 1, counters, floor)
}
}
loop(0, Map.empty, 0)
}
}
import scala.collection.JavaConversions._
// you can use println for debugging purposes, e.g.
// println("this is a debug message")
object Solution {
def solution(N: Int, A: Array[Int]): Array[Int] = {
@scala.annotation.tailrec
def loop(index: Int, counters: Map[Int, Int], curMax: Int, floor: Int): Array[Int] = {
if (index >= A.length) {
Array.fill(0)(N)
} else {
loop(index + 1, counters, curMax, floor)
}
}
loop(0, Map.empty, 0, 0)
}
}
import scala.collection.JavaConversions._
// you can use println for debugging purposes, e.g.
// println("this is a debug message")
object Solution {
def solution(N: Int, A: Array[Int]): Array[Int] = {
@scala.annotation.tailrec
def loop(index: Int, counters: Map[Int, Int], curMax: Int, floor: Int): Array[Int] = {
if (index >= A.length) {
val result = Array.fill(0)(N)
(1 to N) foreach { counter =>
val counterValue = counters.getOrElse(counter, 0) + floor
result(counter - 1) = counterValue
}
result
} else {
loop(index + 1, counters, curMax, floor)
}
}
loop(0, Map.empty, 0, 0)
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at Solution$$anonfun$loop$1$1.apply$mcVI$sp(Solution.scala:14) at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:166) at Solution$.loop$1(Solution.scala:12) at Solution$.solution(Solution.scala:22) at Wrapper$.run(user.scala:32) at Wrapper$.main(user.scala:25) at Wrapper.main(user.scala)
import scala.collection.JavaConversions._
// you can use println for debugging purposes, e.g.
// println("this is a debug message")
object Solution {
def solution(N: Int, A: Array[Int]): Array[Int] = {
@scala.annotation.tailrec
def loop(index: Int, counters: Map[Int, Int], curMax: Int, floor: Int): Array[Int] = {
if (index >= A.length) {
val result = Array.fill(N)(0)
(1 to N) foreach { counter =>
val counterValue = counters.getOrElse(counter, 0) + floor
result(counter - 1) = counterValue
}
result
} else {
loop(index + 1, counters, curMax, floor)
}
}
loop(0, Map.empty, 0, 0)
}
}
import scala.collection.JavaConversions._
// you can use println for debugging purposes, e.g.
// println("this is a debug message")
object Solution {
def solution(N: Int, A: Array[Int]): Array[Int] = {
@scala.annotation.tailrec
def loop(index: Int, counters: Map[Int, Int], curMax: Int, floor: Int): Array[Int] = {
if (index >= A.length) {
val result = Array.fill(N)(0)
(1 to N) foreach { counter =>
val counterValue = counters.getOrElse(counter, 0) + floor
result(counter - 1) = counterValue
}
result
} else {
val currentValue = A(i)
if (currentValue >= 1 && currentValue < (N + 1)) {
println("Increment: " + currentValue)
} else if (currentValue == (N + 1)) {
println("Bump all!")
} else {
sys.error("Unexpected input")
}
loop(index + 1, counters, curMax, floor)
}
}
loop(0, Map.empty, 0, 0)
}
}
Solution.scala:18: error: not found: value i val currentValue = A(i) ^ one error found
import scala.collection.JavaConversions._
// you can use println for debugging purposes, e.g.
// println("this is a debug message")
object Solution {
def solution(N: Int, A: Array[Int]): Array[Int] = {
@scala.annotation.tailrec
def loop(index: Int, counters: Map[Int, Int], curMax: Int, floor: Int): Array[Int] = {
if (index >= A.length) {
val result = Array.fill(N)(0)
(1 to N) foreach { counter =>
val counterValue = counters.getOrElse(counter, 0) + floor
result(counter - 1) = counterValue
}
result
} else {
val currentValue = A(index)
if (currentValue >= 1 && currentValue < (N + 1)) {
println("Increment: " + currentValue)
} else if (currentValue == (N + 1)) {
println("Bump all!")
} else {
sys.error("Unexpected input")
}
loop(index + 1, counters, curMax, floor)
}
}
loop(0, Map.empty, 0, 0)
}
}
Increment: 3 Increment: 4 Increment: 4 Bump all! Increment: 1 Increment: 4 Increment: 4
import scala.collection.JavaConversions._
// you can use println for debugging purposes, e.g.
// println("this is a debug message")
object Solution {
def solution(N: Int, A: Array[Int]): Array[Int] = {
@scala.annotation.tailrec
def loop(index: Int, counters: Map[Int, Int], curMax: Int, floor: Int): Array[Int] = {
if (index >= A.length) {
val result = Array.fill(N)(0)
(1 to N) foreach { counter =>
val counterValue = counters.getOrElse(counter, 0) + floor
result(counter - 1) = counterValue
}
result
} else {
val currentValue = A(index)
if (currentValue >= 1 && currentValue < (N + 1)) {
val nextCounterValue = counters.getOrElse(currentValue, 0) + 1
val nextMax = curMax max nextCounterValue
val nextCounters = counters + (currentValue -> nextCounterValue)
loop(index + 1, nextCounters, nextMax, floor)
} else if (currentValue == (N + 1)) {
val nextFloor = floor + curMax
loop(index + 1, Map.empty, 0, nextFloor)
} else {
sys.error("Unexpected input")
}
}
}
loop(0, Map.empty, 0, 0)
}
}
import scala.collection.JavaConversions._
// you can use println for debugging purposes, e.g.
// println("this is a debug message")
object Solution {
def solution(N: Int, A: Array[Int]): Array[Int] = {
@scala.annotation.tailrec
def loop(index: Int, counters: Map[Int, Int], curMax: Int, floor: Int): Array[Int] = {
if (index >= A.length) {
val result = Array.fill(N)(0)
(1 to N) foreach { counter =>
val counterValue = counters.getOrElse(counter, 0) + floor
result(counter - 1) = counterValue
}
result
} else {
val currentValue = A(index)
if (currentValue >= 1 && currentValue < (N + 1)) {
val nextCounterValue = counters.getOrElse(currentValue, 0) + 1
val nextMax = curMax max nextCounterValue
val nextCounters = counters + (currentValue -> nextCounterValue)
loop(index + 1, nextCounters, nextMax, floor)
} else if (currentValue == (N + 1)) {
val nextFloor = floor + curMax
loop(index + 1, Map.empty, 0, nextFloor)
} else {
sys.error("Unexpected input")
}
}
}
loop(0, Map.empty, 0, 0)
}
}
import scala.collection.JavaConversions._
// you can use println for debugging purposes, e.g.
// println("this is a debug message")
object Solution {
def solution(N: Int, A: Array[Int]): Array[Int] = {
@scala.annotation.tailrec
def loop(index: Int, counters: Map[Int, Int], curMax: Int, floor: Int): Array[Int] = {
if (index >= A.length) {
val result = Array.fill(N)(0)
(1 to N) foreach { counter =>
val counterValue = counters.getOrElse(counter, 0) + floor
result(counter - 1) = counterValue
}
result
} else {
val currentValue = A(index)
if (currentValue >= 1 && currentValue < (N + 1)) {
val nextCounterValue = counters.getOrElse(currentValue, 0) + 1
val nextMax = curMax max nextCounterValue
val nextCounters = counters + (currentValue -> nextCounterValue)
loop(index + 1, nextCounters, nextMax, floor)
} else if (currentValue == (N + 1)) {
val nextFloor = floor + curMax
loop(index + 1, Map.empty, 0, nextFloor)
} else {
sys.error("Unexpected input")
}
}
}
loop(0, Map.empty, 0, 0)
}
}
The solution obtained perfect score.