Skip to content

Instantly share code, notes, and snippets.

@DVegasa
Created October 16, 2018 17:13
Show Gist options
  • Save DVegasa/0cc081b97764faa3625c0601d10e5f3d to your computer and use it in GitHub Desktop.
Save DVegasa/0cc081b97764faa3625c0601d10e5f3d to your computer and use it in GitHub Desktop.
package io.github.dvegasa;
import org.junit.platform.commons.annotation.Testable;
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(nextPalindrom(sc.nextLine()));
}
public static String nextPalindrom(String number) {
BigInteger num = new BigInteger(number);
if (isPalindrom(num.toString())) {
num = num.add(BigInteger.ONE);
if (isPalindrom(num.toString())) {
return num.toString();
}
}
// v v
int iM = num.toString().length() / 2; // середина числа 12345 1234
int iPosR = num.toString().length() - 1;
for (; iPosR >= iM; iPosR--) {
int iPosL = num.toString().length() - 1 - iPosR;
char l = num.toString().charAt(iPosL);
char r = num.toString().charAt(iPosR);
if (l != r) {
if (r > l) {
// Повышаем разряд числа
int zeros = num.toString().length() - iPosR;
StringBuilder toAdd = new StringBuilder("1");
for (int i = 0; i < zeros; i++) {
toAdd.append("0");
}
num = num.add(new BigInteger(toAdd.toString()));
}
// Заменяем цифры с правого конца на цифры [iPosL] с левого, чтобы совпадали
char[] newString = num.toString().toCharArray();
newString[iPosR] = num.toString().charAt(iPosL);
num = new BigInteger(new String(newString));
}
}
return num.toString();
}
@Testable
public static boolean isPalindrom(String num) {
for (int i = 0; i < num.length() / 2; i++) {
if (!(num.charAt(i) == num.charAt(num.length() - 1 - i))) {
return false;
}
}
return true;
}
}
@DVegasa
Copy link
Author

DVegasa commented Oct 16, 2018

// All tests passed

    @Test
    void isPalindrom_test() {
        assertTrue(Main.isPalindrom("0"));
        assertTrue(Main.isPalindrom("1"));

        assertTrue(Main.isPalindrom("11"));
        assertTrue(Main.isPalindrom("44"));

        assertTrue(Main.isPalindrom("141"));
        assertTrue(Main.isPalindrom("010"));
        assertTrue(Main.isPalindrom("999"));
        assertTrue(Main.isPalindrom("909"));

        assertTrue(Main.isPalindrom("1234321"));
        assertTrue(Main.isPalindrom("123454321"));
        assertTrue(Main.isPalindrom("99999" + "99999" + "0" + "99999" + "99999"));
        assertTrue(Main.isPalindrom("99999" + "99999" + "00" + "99999" + "99999"));

        assertFalse(Main.isPalindrom("12"));
        assertFalse(Main.isPalindrom("01"));
        assertFalse(Main.isPalindrom("90"));

        assertFalse(Main.isPalindrom("990"));
        assertFalse(Main.isPalindrom("0909"));
        assertFalse(Main.isPalindrom("4949"));

        assertFalse(Main.isPalindrom("99999" + "99999" + "0" + "99999" + "99999" + "1"));
        assertFalse(Main.isPalindrom("1" + "99999" + "99999" + "0" + "99999" + "99999"));
        assertFalse(Main.isPalindrom("1" + "99999" + "99999" + "01" + "99999" + "99999"));
    }

    @Test
    void nextPalindrom_test() {
        assertEquals("2", Main.nextPalindrom("1"));
        assertEquals("1", Main.nextPalindrom("0"));

        assertEquals("11", Main.nextPalindrom("9"));
        assertEquals("11", Main.nextPalindrom("10"));
        assertEquals("22", Main.nextPalindrom("11"));
        assertEquals("22", Main.nextPalindrom("15"));
        assertEquals("22", Main.nextPalindrom("21"));

        assertEquals("33", Main.nextPalindrom("22"));
        assertEquals("33", Main.nextPalindrom("23"));
        assertEquals("33", Main.nextPalindrom("32"));

        assertEquals("101", Main.nextPalindrom("99"));
        assertEquals("101", Main.nextPalindrom("100"));

        assertEquals("11111", Main.nextPalindrom("11101"));
        assertEquals("11111", Main.nextPalindrom("11109"));

        assertEquals("11011", Main.nextPalindrom("11000"));

        assertEquals("10000022000001", Main.nextPalindrom("10000011000001"));
        assertEquals("567909765", Main.nextPalindrom("567898765"));
        assertEquals("567766667765", Main.nextPalindrom("567765567765"));
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment