[Java] Ich habe versucht, Paizas B-Rang-Problem zu lösen

Einführung

Ich habe versucht, "Maximale durchschnittliche Anzahl täglicher Besucher (entspricht Paiza-Rang B)" aus der Skill-Check-Problemsammlung (Java Edition) zu lösen: erröten: Ich bin neu in der Programmierung, aber ich habe den Algorithmus-Teil auf leicht verständliche Weise zusammengefasst! Der Autor ist übrigens B-Rang ohne praktische Erfahrung. ..

[Problem Link] https://paiza.jp/works/mondai/skillcheck_archive/max_range?language_uid=java

Inhaltsverzeichnis

--Problem

Problem

Problemstellung

Sie hatten die Kontrolle über eine Website. Ich habe eine Reihe von k Tagen lang eine Kampagne auf dieser Website durchgeführt, aber vergessen, wie lange es gedauert hat.

Glücklicherweise haben wir Zugriffsprotokolle für alle n Tage, an denen die Website ausgeführt wird, und wir kennen die Anzahl der Besucher pro Tag. Vorerst habe ich beschlossen, den Zeitraum mit der höchsten durchschnittlichen Besucherzahl pro Tag unter den k aufeinander folgenden Tagen als Kandidaten für den Zeitraum zu betrachten, in dem die Kampagne durchgeführt wurde.

Besucher im Wert von n Tagen und Kampagnentage k werden eingegeben. Geben Sie daher die Anzahl der Kandidaten für den Kampagnenzeitraum und das früheste Startdatum unter den Kandidaten ein.


einzugebender Wert

Der Eingang besteht aus 2 Zeilen. In der ersten Zeile werden n und k durch ein Leerzeichen halber Breite getrennt eingegeben. In der zweiten Zeile werden n ganze Zahlen a_1, a_2,…, a_n eingegeben, die durch Leerzeichen halber Breite getrennt sind. a_i repräsentiert die Anzahl der Besucher am Tag i.


Erwartete Ausgabe

Bitte geben Sie die Anzahl der Kandidaten für den Kampagnenzeitraum und das früheste Startdatum unter den Kandidaten in dieser Reihenfolge ein, getrennt durch Leerzeichen halber Breite in einer Zeile.


Bedingungen

In allen Testfällen sind folgende Bedingungen erfüllt. ・ 1 ≤ n ≤ 1.000 ・ 1 ≤ k ≤ n ・ 0 ≤ a_i ≤ 100


5 3
1 2 3 2 1
1 2
10 2
6 2 0 7 1 3 5 3 2 6
5 1

Weitere Informationen finden Sie unter ** hier **, um das Problem zu überprüfen!

Ablauf der Lösung

1. Denken Sie an den allgemeinen Ablauf

Normalerweise schreibe ich den allgemeinen Ablauf durch Auskommentieren und schreibe dann den Code. Dieses Mal habe ich es zum leichteren Verständnis in ein Diagramm gezeichnet! 日別訪問者問題.png

2. Schreiben Sie den Code

Wenn Sie über den allgemeinen Ablauf nachdenken, werde ich den Code schreiben. Ich werde den Code für jeden Prozess schreiben. Ich versuche, die Teile, bei denen der Umfang wahrscheinlich lang ist, in Methoden zu unterteilen.


① Eingabe 1

Die Standardeingabe verwendet die Scannerklasse. image.png

 // Eingabe
	Scanner sc = new Scanner(System.in);
 // Anzahl der Tage, an denen das Zugriffsprotokoll n blieb
	int n = sc.nextInt();
 // Anzahl der Tage, an denen die Kampagne durchgeführt wurde k
	int k = sc.nextInt();

② Eingang 2

image.png In Methoden aufteilen. Schreiben Sie zunächst die Initialisierung des Arrays und den Aufruf der Methode. ↓

 // N-Tage-Besucheranzahl-Array
	int[] visitorCount = new int[n];
 // Anzahl der Besucher eingeben (n Tage)
	visitorCount = inputVisitor(n, visitorCount, sc);

Als nächstes werde ich den Inhalt der Methode schreiben. ↓

	/** 
 * Methode zur Eingabe der Besucherzahl (n Tage)
 * @param n Anzahl der Tage, an denen das Zugriffsprotokoll n blieb
 * @param VisitorCount N-Day Besucheranzahl Array
 * @param sc Standardeingabe
 * @return Ein Array mit der Anzahl der eingegebenen Besucher
	 */
	private static int[] inputVisitor(int n, int[] visitorCount, Scanner sc) {
		for(int i = 0; i < n; i++) {
			visitorCount[i] = sc.nextInt();
		}
		return visitorCount;
	}

③ Erstellen Sie eine Reihe von Gesamtbesucherwerten für k Tage

image.png In Methoden aufteilen. Schreiben Sie zunächst die Initialisierung des Arrays und den Aufruf der Methode. ↓

 // Array der Gesamtzahl der Besucher für k Tage [n - k + 1]
	int[] visitorSumCount = new int[n - k + 1];
 // Besucherzahl berechnen
	visitorSumCount = visitorSum(visitorCount, n, k, visitorSumCount);

Als nächstes werde ich den Inhalt der Methode schreiben. ↓

	/** 
 * Berechnen Sie die Gesamtzahl der Besucher für k Tage ((n - k + 1) mal)
 * @param VisitorCount N-Day Besucheranzahl Array
 * @param n Anzahl der Tage, an denen das Zugriffsprotokoll n blieb
 * @param k Anzahl der Tage, an denen die Kampagne durchgeführt wurde k
 * @param visitSumCount Ein Array von Gesamtbesuchern für k Tage
 * @return Ein Array, das die Gesamtzahl der Besucher für k Tage berechnet
	 */
	private static int[] visitorSum(int[] visitorCount, int n, int k, int[] visitorSumCount) {
		for(int i = 0; i < (n - k + 1); i++) {
			for(int j = i; j < (k + i); j++) {
				visitorSumCount[i] += visitorCount[j];
			}
		}
		return visitorSumCount;
	}

④ Finden Sie den Maximalwert in der Gesamtzahl der Besucher

image.png In Methoden aufteilen. Beschreiben Sie zunächst die Initialisierung von Variablen und den Aufruf von Methoden. ↓

 // Maximaler Wert in VisitorSumCount
	int visitorSumMax = 0;
 // Nach BesucherSumMax fragen
	visitorSumMax = sortVisitorSumMax(visitorSumCount, visitorSumMax);

Als nächstes werde ich den Inhalt der Methode schreiben. ↓

	/**
 * Finden Sie den Maximalwert in der Gesamtzahl der Besucher
 * @param visitSumCount Ein Array von Gesamtbesuchern für k Tage
 * @param VisitorSumMax Maximaler Wert in VisitorSumCount
 * @return Erhaltener Maximalwert
	 */
	private static int sortVisitorSumMax(int[] visitorSumCount, int visitorSumMax) {
		for(int i = 0; i < visitorSumCount.length; i++) {
			if(visitorSumCount[i] > visitorSumMax) {
				visitorSumMax = visitorSumCount[i];
			}
		}
		return visitorSumMax;
	}

⑤ Fügen Sie den Indexwert, der zum Maximalwert im gesamten Besucherarray wird, in die Liste ein.

image.png

 // Liste mit Indexwerten, die besucherSumMax sein werden
	List<Integer> visitorSumMaxStartDay = new ArrayList<>();
 // Nach BesucherSumMaxStartDay fragen
	visitorSumMaxStartDay = visitorSumMaxStartDaySort(visitorSumCount, visitorSumMax, visitorSumMaxStartDay);

Als nächstes werde ich den Inhalt der Methode schreiben. ↓

	/**
 * Speichern Sie den Index, der besucherSumMax wird, in besucherSumCount in der Liste
 * @param visitSumCount Ein Array von Gesamtbesuchern für k Tage
 * @param VisitorSumMax Maximaler Wert in VisitorSumCount
 * @param besucherSumMaxStartDay Index, der in visitersumCount zu besucherSumMax wird
 * @return Gibt eine indizierte Liste zurück
	 */
	private static List<Integer> visitorSumMaxStartDaySort(int[] visitorSumCount, int visitorSumMax, List<Integer> visitorSumMaxStartDay) {
		for(int i = 0; i < visitorSumCount.length; i++) {
			if(visitorSumCount[i] == visitorSumMax) {
				visitorSumMaxStartDay.add(i);
			}
		}
		return visitorSumMaxStartDay;
	}

⑥ Ausgabe

image.png

Das ist das letzte! BesucherSumMaxStartDay Gibt die Anzahl der Elemente in der Liste und den Wert von Index (0) + 1 aus.

 // Die Anzahl der Kandidatentage ausgeben
	System.out.print(visitorSumMaxStartDay.size() + " ");
 // Den ersten Tag des Kandidatendatums ausgeben
	System.out.print(visitorSumMaxStartDay.get(0) + 1);

Antwortcode

Zum Schluss werde ich den Antwortcode posten!

import java.util.*;

public class PaizaB01Visitors {

	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
 // Anzahl der Tage, an denen das Zugriffsprotokoll n blieb
		int n = sc.nextInt();
 // Anzahl der Tage, an denen die Kampagne durchgeführt wurde k
		int k = sc.nextInt();

 // N-Tage-Besucheranzahl-Array
		int[] visitorCount = new int[n];
 // Anzahl der Besucher eingeben (n Tage)
		visitorCount = inputVisitor(n, visitorCount, sc);

 // Array der Gesamtzahl der Besucher für k Tage [n - k + 1]
		int[] visitorSumCount = new int[n - k + 1];
 // Besucherzahl berechnen
		visitorSumCount = visitorSum(visitorCount, n, k, visitorSumCount);

 // Maximaler Wert in VisitorSumCount
		int visitorSumMax = 0;
 // Nach BesucherSumMax fragen
		visitorSumMax = sortVisitorSumMax(visitorSumCount, visitorSumMax);

 // Liste mit Indexwerten, die besucherSumMax sein werden
		List<Integer> visitorSumMaxStartDay = new ArrayList<>();
 // Nach BesucherSumMaxStartDay fragen
		visitorSumMaxStartDay = visitorSumMaxStartDaySort(visitorSumCount, visitorSumMax, visitorSumMaxStartDay);

 // Die Anzahl der Kandidatentage ausgeben
		System.out.print(visitorSumMaxStartDay.size() + " ");
 // Den ersten Tag des Kandidatendatums ausgeben
		System.out.print(visitorSumMaxStartDay.get(0) + 1);

		sc.close();
	}

	/**
 * Methode zur Eingabe der Besucherzahl (n Tage)
 * @param n Anzahl der Tage, an denen das Zugriffsprotokoll n blieb
 * @param VisitorCount N-Day Besucheranzahl Array
 * @param sc Standardeingabe
 * @return Ein Array mit der Anzahl der eingegebenen Besucher
	 */
	private static int[] inputVisitor(int n, int[] visitorCount, Scanner sc) {
		for(int i = 0; i < n; i++) {
			visitorCount[i] = sc.nextInt();
		}
		return visitorCount;
	}

	/**
 * Berechnen Sie die Gesamtzahl der Besucher für k Tage ((n - k + 1) mal)
 * @param VisitorCount N-Day Besucheranzahl Array
 * @param n Anzahl der Tage, an denen das Zugriffsprotokoll n blieb
 * @param k Anzahl der Tage, an denen die Kampagne durchgeführt wurde k
 * @param visitSumCount Ein Array von Gesamtbesuchern für k Tage
 * @return Ein Array, das die Gesamtzahl der Besucher für k Tage berechnet
	 */
	private static int[] visitorSum(int[] visitorCount, int n, int k, int[] visitorSumCount) {
		for(int i = 0; i < (n - k + 1); i++) {
			for(int j = i; j < (k + i); j++) {
				visitorSumCount[i] += visitorCount[j];
			}
		}
		return visitorSumCount;
	}

	/**
 * Finden Sie den Maximalwert in der Gesamtzahl der Besucher
 * @param visitSumCount Ein Array von Gesamtbesuchern für k Tage
 * @param VisitorSumMax Maximaler Wert in VisitorSumCount
 * @return Erhaltener Maximalwert
	 */
	private static int sortVisitorSumMax(int[] visitorSumCount, int visitorSumMax) {
		for(int i = 0; i < visitorSumCount.length; i++) {
			if(visitorSumCount[i] > visitorSumMax) {
				visitorSumMax = visitorSumCount[i];
			}
		}
		return visitorSumMax;
	}

	/**
 * Speichern Sie den Index, der besucherSumMax wird, in besucherSumCount in der Liste
 * @param visitSumCount Ein Array von Gesamtbesuchern für k Tage
 * @param VisitorSumMax Maximaler Wert in VisitorSumCount
 * @param besucherSumMaxStartDay Index, der in visitersumCount zu besucherSumMax wird
 * @return Gibt eine indizierte Liste zurück
	 */
	private static List<Integer> visitorSumMaxStartDaySort(int[] visitorSumCount, int visitorSumMax, List<Integer> visitorSumMaxStartDay) {
		for(int i = 0; i < visitorSumCount.length; i++) {
			if(visitorSumCount[i] == visitorSumMax) {
				visitorSumMaxStartDay.add(i);
			}
		}
		return visitorSumMaxStartDay;
	}
}

abschließend

Vielen Dank für das bisherige Anschauen! Wenn Sie Kommentare oder Verbesserungen haben, würden wir uns freuen, wenn Sie Kommentare abgeben könnten.

Recommended Posts

[Java] Ich habe versucht, Paizas B-Rang-Problem zu lösen
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Ich habe jetzt versucht, Java 8 zusammenzufassen
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ich habe versucht, Java-Lambda-Ausdrücke zusammenzufassen
Ich habe versucht, AOJs binäre Suche zu lösen
Ich habe versucht, das Paiza-Kampagnenproblem "Herausforderung von Phantomdieb 813" zu lösen.
Ich habe versucht, das Problem des Google Tech Dev Guide zu lösen
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby mit Wiederholung zu lösen.
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Java Ich habe versucht, einen einfachen Block zu brechen
Ich habe versucht, neunundneunzig in Java auszugeben
So lösen Sie Ausdrucksprobleme in Java
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
[Java] Versuchen Sie, das Fizz Buzz-Problem zu lösen
Ich habe versucht, den Block mit Java zu brechen (1)
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby zu lösen (Zeitlimit 10 Minuten).
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
paiza Was ich getan habe, um Ruby B Rang zu werden
Ich habe versucht, SQS mit AWS Java SDK zu betreiben
# 2 [Anmerkung] Ich habe versucht, neunundneunzig mit Java zu berechnen.
Ich habe versucht, AOJs Small, Large oder Equal zu lösen
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
[Java] Ich habe versucht, die Yahoo API-Produktsuche zu implementieren
Versuchen Sie, ein eingeschränktes FizzBuzz-Problem in Java zu lösen
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
~ Ich habe jetzt versucht, funktionale Programmierung mit Java zu lernen ~
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich habe Drools (Java, InputStream) ausprobiert.
Ich habe versucht, Java REPL zu verwenden
Ich habe das FizzBuzz-Problem ausprobiert
Ich habe versucht, yum-cron zu verifizieren
Ich habe versucht, Metaprogrammierung mit Java
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich habe versucht, Java Optional und Guard-Klausel koexistieren zu lassen
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Ich habe versucht, Dapr in Java zu verwenden, um die Entwicklung von Mikroservices zu erleichtern
Ich habe einen RESAS-API-Client in Java erstellt
Ich habe versucht, das Problem mit der Ruby-Karaoke-Maschine zu lösen (es gibt ein Beispiel für die Antwort).
Ich habe versucht, das Problem mit dem Ruby-Bonusgetränk zu lösen (es gibt ein Beispiel für die Antwort).
[Java] Versuchen Sie, das Fizz Buzz-Problem mithilfe der rekursiven Verarbeitung zu lösen
Ich habe versucht, C # (Indexer) zu kauen.
Ich habe versucht, die Unterstützung für iOS 14 zusammenzufassen
Ich habe versucht, Java-Anfänger so einzustellen, dass sie Tastenkombinationen in Eclipse verwenden
Ich habe versucht, das Problem bei der Erstellung von Ruby-Bingokarten zu lösen (es gibt ein Beispiel für die Antwort).
Ich habe versucht, UDP mit Java zu kommunizieren
Ich habe versucht, die Methode zu erklären
Ich habe versucht, die Fehlermeldung beim Ausführen von Eclipse (Java) zu übersetzen.
Ich habe das Java-Framework "Quarkus" ausprobiert.
Ich habe versucht, die Java8 Stream API zu verwenden
Ich habe versucht, eine Android-Anwendung mit MVC zu erstellen (Java)
Ich habe versucht, JWT in Java zu verwenden