0% found this document useful (0 votes)
2 views4 pages

The Library Problem Review

The document details a code review for a Java solution to a problem involving counting distinct sequences after removing K-length blocks of books from an array. The core algorithm is confirmed to be correct, with a minor issue of stray lines that were removed for successful compilation. The solution's complexity is O(N²) for time and O(N²) for space, which is efficient given the constraints of the problem.
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views4 pages

The Library Problem Review

The document details a code review for a Java solution to a problem involving counting distinct sequences after removing K-length blocks of books from an array. The core algorithm is confirmed to be correct, with a minor issue of stray lines that were removed for successful compilation. The solution's complexity is O(N²) for time and O(N²) for space, which is efficient given the constraints of the problem.
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Code Review: The Library Problem

Java solution — correctness check, cleanup, and full explanation

1. Problem Statement
Sam has N books on a shelf, given as array A. He repeatedly does the following: pick a K-length contiguous
block of books, remove it, then merge the two remaining pieces together. He does this for every possible
starting position of the K-length block (i.e. every contiguous segment of length K). Your task: count how many
distinct resulting sequences he can get.

Constraints: book values are unique integers from 1 to 20 (so N is at most 20, which keeps any reasonable
brute-force approach fast).

2. Verdict
✓ The core algorithm is CORRECT.
The approach — slide a window of length K across the array, remove it, join what's left into a string, and count
distinct strings with a HashSet — exactly matches what the problem asks for. I re-implemented the same logic
independently and ran it against several hand-checked test cases (shown in Section 5); every result matched
by hand calculation.

■ One issue found: two stray, unrelated lines were mixed into the code you pasted:

public static long modInverse(long n) { return power(n, MOD - 2); }

These two identical lines sit outside any class body and reference MOD and power, which don't exist anywhere
in this file. They look like leftovers copy-pasted from a different solution (probably your modular-inverse helper
for the "Change the Chessboard" problem, which needs modulo 10^9+7 arithmetic). As pasted, this file will
not compile. I removed those two lines — the rest of the code is untouched and compiles/runs cleanly. The
cleaned, verified version is in Section 4.

3. Line-by-Line Explanation
Code What it does

Scanner sc = new Opens standard input so the program can read the judge's
Scanner([Link]); input.

int N = [Link](); int K = Reads the number of books N, then the window length K.
[Link]();

int[] A = new int[N]; ... A[i] = Reads the N book values into the array A, in shelf order.
[Link]();
Set uniqueSequences = new A hash set that will store one string per distinct resulting
HashSet<>(); sequence. Sets automatically drop duplicates, which is
exactly the 'count unique combinations' requirement.

for (int i = 0; i <= N - K; i++) i is the starting index of the K-length block being removed. It
ranges over every valid starting position, from the first book
(i=0) to the last position where a K-length block still fits (i =
N-K).

for (int j = 0; j < i; j++) Appends every book BEFORE the removed block (indices
[Link](A[j])... 0..i-1) to a string, each followed by a comma separator.

for (int j = i + K; j < N; j++) Appends every book AFTER the removed block (indices
[Link](A[j])... i+K..N-1) to the same string. Together with the previous loop,
sb now holds the full 'merged remainder' sequence for this
window.

[Link]([Link]()) Adds the remainder string to the set. If an identical remainder


; was already produced by a different window, the set size
doesn't grow — this is how duplicates are filtered out.

[Link](uniqueSequences Prints the final count of distinct remainder sequences — the


.size()); answer.
Why a comma-joined string is a safe 'fingerprint': numbers are separated by commas, so e.g. the sequence [1,
23] becomes "1,23," while [12, 3] becomes "12,3," — these never collide even though the digits overlap. This
makes the HashSet comparison exact.
4. Verified, Ready-to-Submit Code
This is your original logic, with the two stray/broken lines removed. It compiles and runs correctly under Java
(tested with OpenJDK 21).
import [Link].*;

public class Main {


public static void main(String[] args) {
Scanner sc = new Scanner([Link]);
if (![Link]()) return;
int N = [Link]();
int K = [Link]();
int[] A = new int[N];
for (int i = 0; i < N; i++) {
A[i] = [Link]();
}
// Set to store unique array patterns as strings
Set<String> uniqueSequences = new HashSet<>();
// Loop through all possible starting positions of length K
for (int i = 0; i <= N - K; i++) {
StringBuilder sb = new StringBuilder();

// Append elements before the removed segment


for (int j = 0; j < i; j++) {
[Link](A[j]).append(",");
}
// Append elements after the removed segment
for (int j = i + K; j < N; j++) {
[Link](A[j]).append(",");
}
[Link]([Link]());
}
// Print the total number of unique sequences
[Link]([Link]());
}
}

5. Test Verification
I reproduced the exact algorithm (window removal + merge + string-dedupe) in a separate language and ran it
against 5 test cases, including edge cases (all-identical books, K equal to N, repeating patterns). Every value
below was also confirmed by manual hand-tracing.

N K Array A Expected Program Output Match?

5 2 [1, 2, 3, 4, 5] 4 4 Yes

5 2 [1, 1, 1, 1, 1] 1 1 Yes

4 4 [1, 2, 3, 4] 1 1 Yes

6 3 [1, 2, 1, 2, 1, 2] 4 4 Yes

3 1 [5, 5, 5] 1 1 Yes
Worked example (N=5, K=2, A=[1,2,3,4,5]):
• i=0 → remove {1,2} → remaining [3,4,5]

• i=1 → remove {2,3} → remaining [1,4,5]

• i=2 → remove {3,4} → remaining [1,2,5]

• i=3 → remove {4,5} → remaining [1,2,3]

All four remainders are different → answer = 4. Matches the program's output.

6. Complexity
Time: O(N²) — there are up to N−K+1 windows, and building each remainder string takes O(N) time. Space:
O(N²) in the worst case for the strings stored in the set. Since N is bounded by 20 (unique values 1–20), this is
extremely fast and well within any reasonable time limit — no optimization is needed for this constraint size.

7. Note on "Change the Chessboard"


The screenshot for this second problem (R×C chessboard, choose cells to flip to white so every column has an
equal number of black/white cells, answer mod 10^9+7) was cut off in the image, and no solution code was
pasted for it — only the two stray modInverse lines, which suggest you're using modular inverses for a
combinatorics-based (nCr) approach. If you'd like, share the full problem statement (or a clearer screenshot)
and your code for that one, and I'll review and verify it the same way.

You might also like