[shift-char-in-string] rotate a string (#15441)

This commit is contained in:
Kai Yuan 2023-12-22 02:57:56 +01:00 committed by GitHub
parent 4b1e73b005
commit ca584307b2
4 changed files with 121 additions and 1 deletions

View File

@ -0,0 +1,5 @@
## Java String Algorithms
This module contains articles about string-related algorithms.
### Relevant Articles:

View File

@ -0,0 +1,14 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>core-java-string-algorithms-4</artifactId>
<name>core-java-string-algorithms-4</name>
<packaging>jar</packaging>
<parent>
<groupId>com.baeldung.core-java-modules</groupId>
<artifactId>core-java-modules</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
</project>

View File

@ -0,0 +1,100 @@
package com.baeldung.string.shiftchar;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
public class ShiftCharInStringUnitTest {
private final static String STRING = "abcdefg";
private final static String EXPECT_1X = "gabcdef";
private final static String EXPECT_2X = "fgabcde";
private final static String EXPECT_3X = "efgabcd";
private final static String EXPECT_6X = "bcdefga";
private final static String EXPECT_7X = "abcdefg";
private final static String EXPECT_24X = "efgabcd";
private final static String B_EXPECT_1X = "bcdefga";
private final static String B_EXPECT_2X = "cdefgab";
private final static String B_EXPECT_3X = "defgabc";
private final static String B_EXPECT_6X = "gabcdef";
private final static String B_EXPECT_7X = "abcdefg";
private final static String B_EXPECT_24X = "defgabc";
static String rotateString1(String s, int c, boolean forward) {
if (c < 0) {
throw new IllegalArgumentException("Rotation character count cannot be negative!");
}
int len = s.length();
int n = c % len;
if (n == 0) {
return s;
}
n = forward ? n : len - n;
return s.substring(len - n, len) + s.substring(0, len - n);
}
static String rotateString2(String s, int c, boolean forward) {
if (c < 0) {
throw new IllegalArgumentException("Rotation character count cannot be negative!");
}
int len = s.length();
int n = c % len;
if (n == 0) {
return s;
}
String ss = s + s;
n = forward ? n : len - n;
return ss.substring(len - n, 2 * len - n);
}
static boolean rotatedFrom(String rotated, String rotateFrom) {
return rotateFrom.length() == rotated.length() && (rotateFrom + rotateFrom).contains(rotated);
}
@Test
void whenUsingRotateString1_thenGetExpectedResults() {
assertEquals(EXPECT_1X, rotateString1(STRING, 1, true));
assertEquals(EXPECT_2X, rotateString1(STRING, 2, true));
assertEquals(EXPECT_3X, rotateString1(STRING, 3, true));
assertEquals(EXPECT_6X, rotateString1(STRING, 6, true));
assertEquals(EXPECT_7X, rotateString1(STRING, 7, true));
assertEquals(EXPECT_24X, rotateString1(STRING, 24, true));
//backward
assertEquals(B_EXPECT_1X, rotateString1(STRING, 1, false));
assertEquals(B_EXPECT_2X, rotateString1(STRING, 2, false));
assertEquals(B_EXPECT_3X, rotateString1(STRING, 3, false));
assertEquals(B_EXPECT_6X, rotateString1(STRING, 6, false));
assertEquals(B_EXPECT_7X, rotateString1(STRING, 7, false));
assertEquals(B_EXPECT_24X, rotateString1(STRING, 24, false));
}
@Test
void whenUsingShiftString2_thenGetExpectedResults() {
assertEquals(EXPECT_1X, rotateString2(STRING, 1, true));
assertEquals(EXPECT_2X, rotateString2(STRING, 2, true));
assertEquals(EXPECT_3X, rotateString2(STRING, 3, true));
assertEquals(EXPECT_6X, rotateString2(STRING, 6, true));
assertEquals(EXPECT_7X, rotateString2(STRING, 7, true));
assertEquals(EXPECT_24X, rotateString2(STRING, 24, true));
//backward
assertEquals(B_EXPECT_1X, rotateString2(STRING, 1, false));
assertEquals(B_EXPECT_2X, rotateString2(STRING, 2, false));
assertEquals(B_EXPECT_3X, rotateString2(STRING, 3, false));
assertEquals(B_EXPECT_6X, rotateString2(STRING, 6, false));
assertEquals(B_EXPECT_7X, rotateString2(STRING, 7, false));
assertEquals(B_EXPECT_24X, rotateString2(STRING, 24, false));
}
@Test
void whenUsingRotateFrom_thenGetExpectedResults() {
assertTrue(rotatedFrom(EXPECT_7X, STRING));
assertTrue(rotatedFrom(B_EXPECT_3X, STRING));
assertFalse(rotatedFrom("abcefgd", STRING));
}
}

View File

@ -65,7 +65,6 @@
<module>core-java-streams-5</module>
<module>core-java-streams-collect</module>
<module>core-java-streams-maps</module>
<module>core-java-string-algorithms-3</module>
<!--<module>core-java-string-operations-3</module>--> <!-- failing after upgrading to jdk17 -->
<module>core-java-string-operations-4</module>
<!--<module>core-java-string-operations-5</module>--> <!-- failing after upgrading to jdk17 -->
@ -185,6 +184,8 @@
<module>core-java-streams-3</module>
<module>core-java-string-algorithms</module>
<module>core-java-string-algorithms-2</module>
<module>core-java-string-algorithms-3</module>
<module>core-java-string-algorithms-4</module>
<module>core-java-string-apis</module>
<!--<module>core-java-string-apis-2</module>--> <!-- failing after upgrading to jdk17 -->
<module>core-java-swing</module>