Hackerrank – Popis problému
Celý popis zadania sa nacháza – Hackerrank.
Riešenie
Dĺžka slova opakovaného niekoľkokrát za sebou by prekročila časové limity pre toto zadanie. Musíme si ho nejako zjednodušiť.
Máme zadaný reťazec – s
. Spočítame výskyt znaku "a"
a označíme si ho ako – c
Získaj dĺžku výsledného reťazca (zadané na druhom riadku) – označíme n
.
Zisti koľkokrát sa nachádza reťazec s
v prvých n
znakoch – t = n / length(s)
Určíme si zvyšok nejakých znakoch v n
-znakovom reťazci – rest = n - t * length(s)
Zisti, koľko znakov "a"
je zvyšku rest
of the string – r
.
Výpočet pre celkový počet znakov "a"
:
c * t + r
Vytvoril som riešenie v týchto programovacích jazykoch:
Všetky riešenia sú dostupné aj na mojom GitHub profile.
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.util.*; public class RepeatedString { public static void main(String[] args) { Scanner stdin = new Scanner(System.in); String s = stdin.nextLine(); long n = Long.parseLong(stdin.nextLine()); long as = s.chars().filter(c -> c == 'a').count(); long times = n / s.length(); long rest = n % s.length(); long totalAs = times * as + s.substring(0, (int) rest).chars().filter(c -> c == 'a').count(); System.out.println(totalAs); stdin.close(); } } |
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
'use strict'; const processData = input => { const lines = input.split('\n'); const s = lines[0]; const n = parseInt(lines[1]); const as = s.split("").filter(c => c === "a").length; const times = parseInt(n / s.length); const rest = n % s.length; const totalAs = times * as + s.slice(0, rest).split("").filter(c => c === "a").length; console.log(totalAs); }; process.stdin.resume(); process.stdin.setEncoding("ascii"); let _input = ""; process.stdin.on("data", input => _input += input); process.stdin.on("end", () => processData(_input)); |
Scala
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import scala.io.Source object RepeatedString extends App { val lines = Source.stdin.getLines().toList val string = lines.head val letters = lines(1).toLong val as = string.count(_ == 'a') val times = letters / string.length val rest = letters % string.length val totalAs = times * as + string.substring(0, rest.toInt).count(_ == 'a') println(totalAs) } |
Ruby
1 2 3 4 5 6 7 8 9 |
s = gets.strip n = gets.strip.to_i as = s.count("a") times = n / s.size rest = n % s.size totalAs = times * as + s.slice(0, rest).count("a") puts totalAs |