Soluție HackerRank pentru What’s Next?. Include cerința formatată, exemple, explicația pașilor și cod sursă.
- Problemă: What’s Next?
Cerinta completa
Johnny is playing with a large binary number, [Expresie matematică indisponibilă în copia arhivată]. The number is so large that it needs to be compressed into an array of integers, [Expresie matematică indisponibilă în copia arhivată], where the values in even indices ([Expresie matematică indisponibilă în copia arhivată]) represent some number of consecutive [Expresie matematică indisponibilă în copia arhivată] bits and the values in odd indices ([Expresie matematică indisponibilă în copia arhivată]) represent some number of consecutive [Expresie matematică indisponibilă în copia arhivată] bits in alternating substrings of [Expresie matematică indisponibilă în copia arhivată].
For example, suppose we have array [Expresie matematică indisponibilă în copia arhivată]. [Expresie matematică indisponibilă în copia arhivată] represents [Expresie matematică indisponibilă în copia arhivată], [Expresie matematică indisponibilă în copia arhivată] represents [Expresie matematică indisponibilă în copia arhivată], [Expresie matematică indisponibilă în copia arhivată] represents [Expresie matematică indisponibilă în copia arhivată], [Expresie matematică indisponibilă în copia arhivată] represents [Expresie matematică indisponibilă în copia arhivată], and [Expresie matematică indisponibilă în copia arhivată] represents [Expresie matematică indisponibilă în copia arhivată]. The number of consecutive binary characters in the [Expresie matematică indisponibilă în copia arhivată] substring of [Expresie matematică indisponibilă în copia arhivată] corresponds to integer [Expresie matematică indisponibilă în copia arhivată], as shown in this diagram:

When we assemble the sequential alternating sequences of [Expresie matematică indisponibilă în copia arhivată]‘s and [Expresie matematică indisponibilă în copia arhivată]‘s, we get [Expresie matematică indisponibilă în copia arhivată].
We define setCount([Expresie matematică indisponibilă în copia arhivată]) to be the number of [Expresie matematică indisponibilă în copia arhivată]‘s in a binary number, [Expresie matematică indisponibilă în copia arhivată]. Johnny wants to find a binary number, [Expresie matematică indisponibilă în copia arhivată], that is the smallest binary number [Expresie matematică indisponibilă în copia arhivată] where setCount([Expresie matematică indisponibilă în copia arhivată]) = setCount([Expresie matematică indisponibilă în copia arhivată]). He then wants to compress [Expresie matematică indisponibilă în copia arhivată] into an array of integers, [Expresie matematică indisponibilă în copia arhivată] (in the same way that integer array [Expresie matematică indisponibilă în copia arhivată] contains the compressed form of binary string [Expresie matematică indisponibilă în copia arhivată]).
Johnny isn’t sure how to solve the problem. Given array [Expresie matematică indisponibilă în copia arhivată], find integer array [Expresie matematică indisponibilă în copia arhivată] and print its length on a new line. Then print the elements of array [Expresie matematică indisponibilă în copia arhivată] as a single line of space-separated integers.
Input Format
The first line contains a single positive integer, [Expresie matematică indisponibilă în copia arhivată], denoting the number of test cases. Each of the [Expresie matematică indisponibilă în copia arhivată] subsequent lines describes a test case over [Expresie matematică indisponibilă în copia arhivată] lines:
- The first line contains a single positive integer, [Expresie matematică indisponibilă în copia arhivată], denoting the length of array [Expresie matematică indisponibilă în copia arhivată].
- The second line contains [Expresie matematică indisponibilă în copia arhivată] positive space-separated integers describing the respective elements in integer array [Expresie matematică indisponibilă în copia arhivată] (i.e., [Expresie matematică indisponibilă în copia arhivată]).
Constraints
- [Expresie matematică indisponibilă în copia arhivată]
- [Expresie matematică indisponibilă în copia arhivată]
Subtasks
- For a [Expresie matematică indisponibilă în copia arhivată] score, [Expresie matematică indisponibilă în copia arhivată].
- For a [Expresie matematică indisponibilă în copia arhivată] score, [Expresie matematică indisponibilă în copia arhivată].
Output Format
For each test case, print the following [Expresie matematică indisponibilă în copia arhivată] lines:
- Print the length of integer array [Expresie matematică indisponibilă în copia arhivată] (the array representing the compressed form of binary integer [Expresie matematică indisponibilă în copia arhivată]) on a new line.
- Print each element of [Expresie matematică indisponibilă în copia arhivată] as a single line of space-separated integers.
It is guaranteed that a solution exists.
Sample Input 0
1
5
4 1 3 2 4
Sample Output 0
7
4 1 3 1 1 1 3
Explanation 0
[Expresie matematică indisponibilă în copia arhivată], which expands to [Expresie matematică indisponibilă în copia arhivată]. We then find setCount([Expresie matematică indisponibilă în copia arhivată]) [Expresie matematică indisponibilă în copia arhivată]. The smallest binary number [Expresie matematică indisponibilă în copia arhivată] which also has eleven [Expresie matematică indisponibilă în copia arhivată]‘s is [Expresie matematică indisponibilă în copia arhivată]. This can be reduced to the integer array [Expresie matematică indisponibilă în copia arhivată]. This is demonstrated by the following figure:

Having found [Expresie matematică indisponibilă în copia arhivată], we print its length ([Expresie matematică indisponibilă în copia arhivată]) as our first line of output, followed by the space-separated elements in [Expresie matematică indisponibilă în copia arhivată] as our second line of output.
Limbajul de programare folosit: java8
Cod:
import java.io.*;
import java.util.*;
public class Solution {
private static class FastScanner {
private final InputStream in;
private final byte[] buffer = new byte[1 << 16];
private int ptr = 0, len = 0;
FastScanner(InputStream is) { this.in = is; }
private int read() throws IOException {
if (ptr >= len) {
len = in.read(buffer);
ptr = 0;
if (len <= 0) return -1;
}
return buffer[ptr++];
}
long nextLong() throws IOException {
int c;
do { c = read(); } while (c <= ' ' && c != -1);
int sign = 1;
if (c == '-') { sign = -1; c = read(); }
long val = 0;
while (c > ' ') {
val = val * 10 + (c - '0');
c = read();
}
return sign == 1 ? val : -val;
}
int nextInt() throws IOException { return (int) nextLong(); }
}
static void appendRun(ArrayList<Long> runs, int bit, long len) {
if (len <= 0) return;
if (runs.isEmpty()) {
if (bit == 0) return; // avoid leading zeros
runs.add(len);
return;
}
int endBit = (runs.size() % 2 == 1) ? 1 : 0;
if (endBit == bit) {
int last = runs.size() - 1;
runs.set(last, runs.get(last) + len);
} else {
runs.add(len);
}
}
public static void main(String[] args) throws Exception {
FastScanner fs = new FastScanner(System.in);
int T = fs.nextInt();
StringBuilder out = new StringBuilder();
while (T-- > 0) {
int n = fs.nextInt();
ArrayList<Long> a = new ArrayList<>();
long totalBits = 0;
for (int i = 0; i < n; i++) {
long v = fs.nextLong();
a.add(v);
totalBits += v;
}
long c0, c1;
if ((n & 1) == 0) {
// ends with zeros
c0 = a.get(n - 1);
c1 = a.get(n - 2);
} else {
// ends with ones
c0 = 0;
c1 = a.get(n - 1);
}
long remove = c0 + c1 + 1; // remove bits at and below pivot
ArrayList<Long> higher = new ArrayList<>(a);
while (remove > 0 && !higher.isEmpty()) {
int last = higher.size() - 1;
long len = higher.get(last);
if (len <= remove) {
remove -= len;
higher.remove(last);
} else {
higher.set(last, len - remove);
remove = 0;
}
}
ArrayList<Long> c = new ArrayList<>(higher);
appendRun(c, 1, 1); // flipped pivot bit
appendRun(c, 0, c0 + 1); // zeros just below pivot
appendRun(c, 1, c1 - 1); // move remaining ones to far right
out.append(c.size()).append('\n');
for (int i = 0; i < c.size(); i++) {
if (i > 0) out.append(' ');
out.append(c.get(i));
}
out.append('\n');
}
System.out.print(out);
}
}
Scor obtinut: 1.0
Submission ID: 464618364
Link challenge: https://www.hackerrank.com/challenges/whats-next/problem
