From a67e40d8b894352e65f5ee6ea9ede8a0ca09ebeb Mon Sep 17 00:00:00 2001 From: Rully Date: Sun, 12 Jan 2025 10:18:32 +0700 Subject: [PATCH 1/3] improve zig-zag-pattern --- .../strings/zigZagPattern/ZigZagPattern.java | 55 ++++++++++--------- .../zigZagPattern/ZigZagPatternTest.java | 2 +- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/thealgorithms/strings/zigZagPattern/ZigZagPattern.java b/src/main/java/com/thealgorithms/strings/zigZagPattern/ZigZagPattern.java index 3f33fc17b9b0..5b9b05654bd6 100644 --- a/src/main/java/com/thealgorithms/strings/zigZagPattern/ZigZagPattern.java +++ b/src/main/java/com/thealgorithms/strings/zigZagPattern/ZigZagPattern.java @@ -1,41 +1,44 @@ package com.thealgorithms.strings.zigZagPattern; final class ZigZagPattern { + private ZigZagPattern() { } + /** + * Encodes a given string into a zig-zag pattern. + * + * @param s the input string to be encoded + * @param numRows the number of rows in the zig-zag pattern + * @return the encoded string in zig-zag pattern format + */ public static String encode(String s, int numRows) { if (numRows < 2 || s.length() < numRows) { return s; } - int start = 0; + + StringBuilder[] rows = new StringBuilder[numRows]; + for (int i = 0; i < numRows; i++) { + rows[i] = new StringBuilder(); + } + int index = 0; - int height = 1; - int depth = numRows; - char[] zigZagedArray = new char[s.length()]; - while (depth != 0) { - int pointer = start; - int heightSpace = 2 + ((height - 2) * 2); - int depthSpace = 2 + ((depth - 2) * 2); - boolean bool = true; - while (pointer < s.length()) { - zigZagedArray[index++] = s.charAt(pointer); - if (heightSpace == 0) { - pointer += depthSpace; - } else if (depthSpace == 0) { - pointer += heightSpace; - } else if (bool) { - pointer += depthSpace; - bool = false; - } else { - pointer += heightSpace; - bool = true; - } + while (index < s.length()) { + for (int i = 0; i < numRows && index < s.length(); i++) { + rows[i].append(s.charAt(index)); + index++; } - height++; - depth--; - start++; + for (int i = numRows - 2; i >= 1 && index < s.length(); i--) { + rows[i].append(s.charAt(index)); + index++; + } + } + + StringBuilder result = new StringBuilder(); + for (StringBuilder row : rows) { + result.append(row); } - return new String(zigZagedArray); + + return result.toString(); } } diff --git a/src/test/java/com/thealgorithms/strings/zigZagPattern/ZigZagPatternTest.java b/src/test/java/com/thealgorithms/strings/zigZagPattern/ZigZagPatternTest.java index 518bfab80f08..7dcb63cbabaa 100644 --- a/src/test/java/com/thealgorithms/strings/zigZagPattern/ZigZagPatternTest.java +++ b/src/test/java/com/thealgorithms/strings/zigZagPattern/ZigZagPatternTest.java @@ -6,7 +6,7 @@ public class ZigZagPatternTest { @Test - public void palindrome() { + public void testZigZagPattern() { String input1 = "HelloWorldFromJava"; String input2 = "javaIsAProgrammingLanguage"; Assertions.assertEquals(ZigZagPattern.encode(input1, 4), "HooeWrrmalolFJvlda"); From 54991cf38f226af47f09b0e6dac19a0d1c4deb93 Mon Sep 17 00:00:00 2001 From: Rully Date: Sun, 12 Jan 2025 10:45:04 +0700 Subject: [PATCH 2/3] retain row based approach --- .../strings/zigZagPattern/ZigZagPattern.java | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/thealgorithms/strings/zigZagPattern/ZigZagPattern.java b/src/main/java/com/thealgorithms/strings/zigZagPattern/ZigZagPattern.java index 5b9b05654bd6..9ac9f68bcc09 100644 --- a/src/main/java/com/thealgorithms/strings/zigZagPattern/ZigZagPattern.java +++ b/src/main/java/com/thealgorithms/strings/zigZagPattern/ZigZagPattern.java @@ -17,28 +17,23 @@ public static String encode(String s, int numRows) { return s; } - StringBuilder[] rows = new StringBuilder[numRows]; - for (int i = 0; i < numRows; i++) { - rows[i] = new StringBuilder(); - } - + char[] result = new char[s.length()]; int index = 0; - while (index < s.length()) { - for (int i = 0; i < numRows && index < s.length(); i++) { - rows[i].append(s.charAt(index)); - index++; - } - for (int i = numRows - 2; i >= 1 && index < s.length(); i--) { - rows[i].append(s.charAt(index)); - index++; - } - } - StringBuilder result = new StringBuilder(); - for (StringBuilder row : rows) { - result.append(row); + // Cycle length for zigzag traversal + int cycleLength = 2 * numRows - 2; + + for (int row = 0; row < numRows; row++) { + for (int j = row; j < s.length(); j += cycleLength) { + result[index++] = s.charAt(j); + + int diagonal = j + cycleLength - 2 * row; + if (row > 0 && row < numRows - 1 && diagonal < s.length()) { + result[index++] = s.charAt(diagonal); + } + } } - return result.toString(); + return new String(result); } } From b648bf7d68b3614db7f92aec204cdee70636c852 Mon Sep 17 00:00:00 2001 From: Rully Date: Sun, 12 Jan 2025 17:34:07 +0700 Subject: [PATCH 3/3] reduce mutable state --- .../strings/zigZagPattern/ZigZagPattern.java | 21 +++++++++---------- .../zigZagPattern/ZigZagPatternTest.java | 4 ++++ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/thealgorithms/strings/zigZagPattern/ZigZagPattern.java b/src/main/java/com/thealgorithms/strings/zigZagPattern/ZigZagPattern.java index 9ac9f68bcc09..ad7835bdbb97 100644 --- a/src/main/java/com/thealgorithms/strings/zigZagPattern/ZigZagPattern.java +++ b/src/main/java/com/thealgorithms/strings/zigZagPattern/ZigZagPattern.java @@ -9,31 +9,30 @@ private ZigZagPattern() { * Encodes a given string into a zig-zag pattern. * * @param s the input string to be encoded - * @param numRows the number of rows in the zig-zag pattern - * @return the encoded string in zig-zag pattern format + * @param numRows the number of rows in the zigzag pattern + * @return the encoded string in zigzag pattern format */ public static String encode(String s, int numRows) { if (numRows < 2 || s.length() < numRows) { return s; } - char[] result = new char[s.length()]; - int index = 0; - - // Cycle length for zigzag traversal + StringBuilder result = new StringBuilder(s.length()); int cycleLength = 2 * numRows - 2; for (int row = 0; row < numRows; row++) { for (int j = row; j < s.length(); j += cycleLength) { - result[index++] = s.charAt(j); + result.append(s.charAt(j)); - int diagonal = j + cycleLength - 2 * row; - if (row > 0 && row < numRows - 1 && diagonal < s.length()) { - result[index++] = s.charAt(diagonal); + if (row > 0 && row < numRows - 1) { + int diagonal = j + cycleLength - 2 * row; + if (diagonal < s.length()) { + result.append(s.charAt(diagonal)); + } } } } - return new String(result); + return result.toString(); } } diff --git a/src/test/java/com/thealgorithms/strings/zigZagPattern/ZigZagPatternTest.java b/src/test/java/com/thealgorithms/strings/zigZagPattern/ZigZagPatternTest.java index 7dcb63cbabaa..2cbbfe3d2dd8 100644 --- a/src/test/java/com/thealgorithms/strings/zigZagPattern/ZigZagPatternTest.java +++ b/src/test/java/com/thealgorithms/strings/zigZagPattern/ZigZagPatternTest.java @@ -11,5 +11,9 @@ public void testZigZagPattern() { String input2 = "javaIsAProgrammingLanguage"; Assertions.assertEquals(ZigZagPattern.encode(input1, 4), "HooeWrrmalolFJvlda"); Assertions.assertEquals(ZigZagPattern.encode(input2, 4), "jAaLgasPrmgaaevIrgmnnuaoig"); + // Edge cases + Assertions.assertEquals("ABC", ZigZagPattern.encode("ABC", 1)); // Single row + Assertions.assertEquals("A", ZigZagPattern.encode("A", 2)); // numRows > length of string + Assertions.assertEquals("", ZigZagPattern.encode("", 3)); // Empty string } }