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:

Lungimile 4, 1, 3, 2, 4 sunt transformate în grupurile binare 1111, 0, 111, 00, 1111.

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:

  1. 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ă].
  2. 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:

  1. 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.
  2. 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:

Șirul binar 1111 0 111 0 1 0 111 este redus la lungimile 4, 1, 3, 1, 1, 1, 3.

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

What’s Next?