Сандық жолдың келесі палиндромын табу үшін жақсы алгоритм

Біріншіден, мәселе мынада:

Оң сан бүтін сандар жүйесінде көрінісі солдан оңға және оңнан солға қарай оқылған болса, палиндром деп аталады. К саны 1000000 саннан аспайтын оң K бүтін санына шығу үшін К-дан үлкенірек ең үлкен пальиндомның мәнін жазыңыз. Сандар әрқашан жетекші нөлдерсіз көрсетіледі.

Кіріс: Бірінші жолда бүтін t, сынақ жағдайларының саны бар. K бүтін сандары келесі жолдарда беріледі.

Шығу: Әрбір K үшін, K-дан үлкенірек ең үлкен пальиндомды шығарыңыз. Мысал

Кіру:

2

808

2133

Шығару:

818

2222

Екіншіден, менің код:

// I know it is bad practice to not cater for erroneous input,
// however for the purpose of the execise it is omitted
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.lang.Exception;
import java.math.BigInteger;

public class Main
{    
    public static void main(String [] args){   
        try{
            Main instance = new Main();//create an instance to access non-static
                                       //variables

           //Use java.util.Scanner to scan the get the input and initialise the
           //variable
            Scanner sc=null;

            BufferedReader r = new BufferedReader(new InputStreamReader(System.in));

            String input = "";

            int numberOfTests = 0;

            String k;//declare any other variables here

            if((input = r.readLine()) != null){
                sc = new Scanner(input);
                numberOfTests = sc.nextInt();
            }

            for (int i = 0; i < numberOfTests; i++){
                if((input = r.readLine()) != null){
                    sc = new Scanner(input);
                    k=sc.next();//initialise the remainder of the variables sc.next()
                    instance.palindrome(k);
                } //if
            }// for
        }// try

        catch (Exception e)
        {
            e.printStackTrace();
        }
    }// main

    public void palindrome(String number){

        StringBuffer theNumber = new StringBuffer(number);
        int length = theNumber.length();
        int left, right, leftPos, rightPos;
       //if incresing a value to more than 9 the value to left (offset) need incrementing
        int offset, offsetPos;
        boolean offsetUpdated;
       //To update the string with new values
        String insert;
        boolean hasAltered = false;

        for(int i = 0; i < length/2; i++){
            leftPos = i; 
            rightPos = (length-1) - i;
            offsetPos = rightPos -1; offsetUpdated = false;

           //set values at opposite indices and offset
            left = Integer.parseInt(String.valueOf(theNumber.charAt(leftPos)));
            right = Integer.parseInt(String.valueOf(theNumber.charAt(rightPos)));
            offset = Integer.parseInt(String.valueOf(theNumber.charAt(offsetPos)));

            if(left != right){
               //if r > l then offest needs updating
                if(right > left){
                   //update and replace
                    right = left;
                    insert = Integer.toString(right);

                    theNumber.replace(rightPos, rightPos + 1, insert);

                    offset++; if (offset == 10) offset = 0;
                    insert = Integer.toString(offset);

                    theNumber.replace(offsetPos, offsetPos + 1, insert);
                    offsetUpdated = true;

                   //then we need to update the value to left again
                    while (offset == 0 && offsetUpdated){ 
                        offsetPos--;
                        offset =
                            Integer.parseInt(String.valueOf(theNumber.charAt(offsetPos)));
                        offset++; if (offset == 10) offset = 0;
                       //replace
                        insert = Integer.toString(offset);
                        theNumber.replace(offsetPos, offsetPos + 1, insert);
                    }
                   //finally incase right and offset are the two middle values
                    left = Integer.parseInt(String.valueOf(theNumber.charAt(leftPos)));
                    if (right != left){
                        right = left;
                        insert = Integer.toString(right);
                        theNumber.replace(rightPos, rightPos + 1, insert);
                    }
                }// if r > l
                else
                   //update and replace
                    right = left;
                    insert = Integer.toString(right);
                    theNumber.replace(rightPos, rightPos + 1, insert);           
            }// if l != r
        }// for i
        System.out.println(theNumber.toString());
    }// palindrome
}

Соңында менің түсініктеме мен сұрақ.

My code compares either end and then moves in
    if left and right are not equal
        if right is greater than left
            (increasing right past 9 should increase the digit
             to its left i.e 09 ---- > 10) and continue to do
             so if require as for 89999, increasing the right
             most 9 makes the value 90000

             before updating my string we check that the right
             and left are equal, because in the middle e.g 78849887
             we set the 9 --> 4 and increase 4 --> 5, so we must cater for this.

Мәселе spoj.pl-тан онлайн-судьялық жүйеден тұрады. Менің кодым барлық сынақтар үшін жұмыс істейді, бірақ мен оны жіберген кезде, қателіктен асып кеткен уақытты аламын және менің жауапым қабылданбайды.

Does anyone have any suggestions as to how I can improve my algorithm. While writing this question i thought that instead of my while (offset == 0 && offsetUpdated) loop i could use a boolean to to make sure i increment the offset on my next [i] iteration. Confirmation of my chang or any suggestion would be appreciated, also let me know if i need to make my question clearer.

13
Сіздің кодыңыз сынақ корпусымен жұмыс істемейді (808 дұрыс емес өңделді).
қосылды автор n.m., көзі
сонымен қатар оны көрсетуге рахмет
қосылды автор Mead3000, көзі
өте жақсы нүкте, бірақ біреуін қосып, оны түзетеді және ол тиімділікке көмектеспейді.
қосылды автор Mead3000, көзі

10 жауаптар

Бұл көптеген кодтар сияқты көрінеді. Сіз әлі өте аңғалдық әдісті қолдандыңыз ба? Пальиндомның бір нәрсе екенін тексеру - шын мәнінде өте қарапайым.

private boolean isPalindrome(int possiblePalindrome) {
    String stringRepresentation = String.valueOf(possiblePalindrome);
    if ( stringRepresentation.equals(stringRepresentation.reverse()) ) {
       return true;
    }
}

Енді бұл ең тиімді коды болмауы мүмкін, бірақ ол сізге шынымен қарапайым бастау нүктесін береді:

private int nextLargestPalindrome(int fromNumber) {
    for ( int i = fromNumber + 1; ; i++ ) {
        if ( isPalindrome( i ) ) {
            return i;
        }
    }
}

Енді бұл жеткіліксіз болса, сіз оны сілтеме ретінде қолдануға және алгоритмдік күрделілігін төмендетуге тырысасыз.

Ең үлкен палиндромды табудың нақты жолы болуы керек (ол кірістің цифрлар санынан жақсы). Мен алгоритмді беремін, ол санның ұзындығы бірдей (бірақ сандардың тақ санына дейін ұзартылуы мүмкін).

  1. Кіріс нөмірінің ондық көрінісін табу («2133»).
  2. Сол жартылай және оң жақ жартыға бөліңіз («21», «33»);
  3. Сол жақтағы соңғы санды және оң жақтағы бірінші санды салыстырыңыз а. Оң жақ сол жағынан үлкен болса, солға және тоқтатуға үлкейтіңіз. («22»)
    б. Егер оң жақ аз болса, тоқтаңыз с. Оң жақ солға тең болса, 3-қадамды сол жақтан екінші және екінші оң жаққа (және т.б.) қайталаңыз.
  4. Сол жақ жартысын алып, сол жақ жартысын кері жағыңыз. Бұл сіздің ең үлкен палиндромыз. («2222»)

Неғұрлым күрделі санға қолданылады:

1.    1234567887654322
2.    12345678   87654322
3.    12345678   87654322
             ^   ^         equal
3.    12345678   87654322
            ^     ^        equal
3.    12345678   87654322
           ^       ^       equal
3.    12345678   87654322
          ^         ^      equal
3.    12345678   87654322
         ^           ^     equal
3.    12345678   87654322
        ^             ^    equal
3.    12345678   87654322
       ^               ^   equal
3.    12345678   87654322
      ^                 ^  greater than, so increment the left

3.    12345679

4.    1234567997654321  answer

Бұл сіз сипаттаған алгоритмге ұқсас, бірақ ол ішкі сандардан басталады және сыртқа жылжиды.

38
қосылды
@Mead: Сіз оны өзіңізге сынап көрдіңіз бе? Қандай қиындыққа тап болдыңыз? Менің алгоритмім сол үшін тікелей алға жылжиды. Сондай-ақ, қосымша жауап сұрамаңыз үшін жауап түзетулеріне/жақсартуларына жауап беруді сұраймыз.
қосылды автор Mark Peters, көзі
@tintinmj: Сіз дұрыссыз, бұл бөлік дұрыс емес; Мен жай ғана алгоритм туралы ойлауға тырыстым. Жолды қайтару үшін StringBuilder.reverse() қолдануға болады.
қосылды автор Mark Peters, көзі
@ Mead3000: Үлкейту үшін, жаңа BigInteger («74939») сияқты нәрсені көріп, бастай аламын. (BigInteger.ONE) .toString() функциясы жеткілікті түрде орындалады (бұл бір реттік операция , Менің ойымша, бұл өте жаман). Ол шектелмеген деректермен шектеледі. Егер бұл жеткіліксіз болса, өзіңіздің сандарыңыздың санына қосымша жаза аласыз. Абай болу керек нәрсе - нәтиже ретінде сандарды қосуды аяқтасаңыз, оны екі айналдыра көрсетіп, тек біреуін ғана көрсетіңіз.
қосылды автор Mark Peters, көзі
@ b.buchhold: Бұл өкінішке орай жұмыс істемейді. 234325 бөлімін қараңыз. 523 234-тен көп болса, алгоритміңіз арқылы келесі ірі палиндром 235532 болуы керек. Бұл дұрыс емес, себебі 234432 ертерек келеді.
қосылды автор Mark Peters, көзі
@Mead: Бұл, сіз аңғалдық әдісті басқара аласыз деген сөз. Мен орналастырған алгоритм үшін бұл заттарды екілік сандар ретінде сақтау керек деп айтатын ештеңе жоқ. Сіз тек Стринцпен толық уақытпен айналысуға болады.
қосылды автор Mark Peters, көзі
Сондай-ақ мен жіберген алгоритм үшін 8999 өңдеуді қандай қиындыққа әкелетініне сенімді емеспін. Сіз 90 кодын ( 9> 8 ) дейін 900 кодын жасап шығара аласыз. Бірақ 9999 тәрізді нәрсе айналасында бұрыштық жағдайлар болады, бірақ сандардың көбеюі. Бірақ бұрыштық жағдайларды (және тақ сандармен жұмыс істеу) сізге қалдырамын.
қосылды автор Mark Peters, көзі
String сыныбында ешқандай reverse() әдісін көрмеймін.
қосылды автор Anirban Nag 'tintinmj', көзі
@CostiCiudatu: Бұл кіріс палиндром болып табылмайтындығын тексермейді.
қосылды автор Bhesh Gurung, көзі
@Марк: Мен өз уақытында жаңармадым, осылайша, сіздің үй тапсырмаңызды жоғарыда қарастырған жоқпын, сондықтан жоғарыда айтылғандарды елемей, оны бәрібір алып тастаймын.
қосылды автор Costi Ciudatu, көзі
@Mark: Шығарылым кіріспен салыстырғанда көп сандар болған кезде не болады? 99 = 101-ден асатын ең кіші палиндром сияқты. Ал жеке-жеке, сіздің алгоритміңізде енгізуде бірдей сандар болады деп болжап отырсыз; мен қателеспін бе?
қосылды автор Costi Ciudatu, көзі
@BheshGurung: Жоқ, жоқ. Бірақ, сіз бұл туралы айтқаныңыздан кейін, менің түсініктеме енгізуді тексеру туралы ештеңе жоқ па? Мүмкін, мен оны қате тұжырымдадым ...: - /
қосылды автор Costi Ciudatu, көзі
егер сіз бүкіл жолды/сызықты белгілерді бөліп, rhs ішкі жолын кері бөліп, оларды салыстыру арқылы оны жақсарта аласыз. егер rhs үлкен болса, бір-бірлікті жоғарылату. содан кейін нәтиже lhs ^ lhs_reversed. #digits үшін біркелкі тек орташа шрифтті ұлғайту керек пе, жоқ па, анық нәрселерді жасаңыз
қосылды автор b.buchhold, көзі
рахмет, мен үйге келгенде тырысамын.
қосылды автор Mead3000, көзі
@MarkPeters кешіріңіздер. Қалай ұсынамын, сол жақты i.e 1 ұлғайтамын. 7493996381 2. 74939 96381 3. 74939 96381 '9' және '9'equal 4. 74939 96481' 3 'және' 6 'сондықтан lhs мәнін ұлғайтуға болады, онда қиындықтар туындаса, мен lhs ондық сан, себебі бұл ықтимал 5 * 10 ^ 5 сан. Менің басқа нұсқам - «9» соңғы санын ұлғайту, содан кейін «3» әсер етуі керек (бірнеше рет менің офсетті пайдалану сияқты) және қайтадан процесті бастау керек еді. Мен қателеспін бе? немесе lhs-ді ұлғайту арқылы менің палиндромды алу үшін кері айналдыра аламын ба?
қосылды автор Mead3000, көзі
@Mark Peter Hpw сіз оны 7499996381 жауапыңызға берген нөмірімге қолданған болар едіңіз
қосылды автор Mead3000, көзі
Нөмірде 1000000-ге дейін сан болуы мүмкін, осылайша int мәселе емес. Алгоритміңізді мен екінші жартыжылдықта 8999 секундтық санның өсуіне бірінші жартысында әсер етуі керек
қосылды автор Mead3000, көзі

Менде тұрақты тәртіптің шешімі бар (тапсырыс тәртібі k, мұнда k - сандағы сандардың саны)

Бірнеше мысал келтірейік Мысалы, n = 17208

ортасынан екі бөлікке бөліңіз және неғұрлым елеулі бөлігін қайта-қайта жазуға болады. яғни 17271 егер жасалған сан сіздің n мәнінен асып кетсе, бұл сіздің палиндромыз, тек орталық нөмірді (pivot) көбейтпесеңіз, яғни 17371

басқа мысалдар

n = 17286 palidrome-attempt = 17271 (бұл жағдайда, бұл 2 нүктеден n артық емес, бұл жағдайда 2) сондықтан palidrome = 17371

n = 5684 palidrome1 = 5665 palidrome = 5775

n = 458322 palindrome = 458854

енді n = 1219901 болсын palidrome1 = 1219121 осьті көбейту мұндағы менің нөмірімді азайтады осылайша, санды іргелес бұрышты да көбейтіңіз 1220221

және бұл логика кеңейтілуі мүмкін

7
қосылды
Мен осындай логиканы қолдандым. Дегенмен, ерекше жағдайларды шешу қажет. Мысалы: n = 999 немесе n = 22 немесе n = 10920 болған жағдайда.
қосылды автор Ashish K Agarwal, көзі

Қажетті операция бір қарапайым қосымша болғанда, жеке сандармен скрипка жасауға ешқандай себеп жоқ. Келесі код Raks жауапына негізделген .

Кодекс белгілі бір жылдамдықпен орындалу жылдамдығымен қарапайым.

import static org.junit.Assert.assertEquals;

import java.math.BigInteger;
import org.junit.Test;

public class NextPalindromeTest {

    public static String nextPalindrome(String num) {
        int len = num.length();
        String left = num.substring(0, len/2);
        String middle = num.substring(len/2, len - len/2);
        String right = num.substring(len - len/2);

        if (right.compareTo(reverse(left)) < 0)
            return left + middle + reverse(left);

        String next = new BigInteger(left + middle).add(BigInteger.ONE).toString();
        return next.substring(0, left.length() + middle.length())
             + reverse(next).substring(middle.length());
    }

    private static String reverse(String s) {
        return new StringBuilder(s).reverse().toString();
    }

    @Test
    public void testNextPalindrome() {
        assertEquals("5", nextPalindrome("4"));
        assertEquals("11", nextPalindrome("9"));
        assertEquals("22", nextPalindrome("15"));
        assertEquals("101", nextPalindrome("99"));
        assertEquals("151", nextPalindrome("149"));
        assertEquals("123454321", nextPalindrome("123450000"));
        assertEquals("123464321", nextPalindrome("123454322"));
    }
}
4
қосылды
Бұл керемет шешім! Көп рақмет!!
қосылды автор MyName, көзі
Бұл әдемі код. Неліктен бұл қарсылықтар емес?
қосылды автор Ashish K Agarwal, көзі

Қарапайым кодтар және сынақ шығысы:

class NextPalin
{
public static void main( String[] args )
{
    try {
        int[] a = {2, 23, 88, 234, 432, 464, 7887, 7657, 34567, 99874, 7779222, 2569981, 3346990, 229999, 2299999 };
        for( int i=0; i

	                
2
қосылды
(1) кодтың қоқысы - бұл жауап емес. Мүмкін, сіз не істегеніңізді, қалай жұмыс істейтінін және т.б. түсіндіріңіз. (2) Сіз миллион бөлікке дейінгі сандар туралы бөлімді көрдіңіз бе? Ints жұмыс істемейді ... ұзындықпен емес.
қосылды автор cHao, көзі

Келесі код келесі нөмірге арналған Паландромның келесі нөмірін табады:

public class TestNextPalindrome {

    public static void main(String[] args) {
        int number1 = 45312;
        int number2 = 12345;
        int number3 = 12945;
        int number4 = 4531;
        int number5 = 1459;
        int number6 = 1997;
        System.out.print("For the number " + number1);
        getNextPalindrome(number1);
        System.out.print("For the number " + number2);
        getNextPalindrome(number2);
        System.out.print("For the number " + number3);
        getNextPalindrome(number3);
        System.out.print("For the number " + number4);
        getNextPalindrome(number4);
        System.out.print("For the number " + number5);
        getNextPalindrome(number5);
        System.out.print("For the number " + number6);
        getNextPalindrome(number6);
    }

    private static void getNextPalindrome(int number) {
        if (isSizeEven(number)) {

            getNextPalindromeForEvenLengthNumbers(number);
        }
        else {
            getNextPalindromeForOddLengthNumbers(number);
        }

    }

    private static boolean isSizeEven(int number) {
        if (String.valueOf(number).length() % 2 == 0)
            return true;
        return false;
    }

    private static void getNextPalindromeForEvenLengthNumbers(int number) {
        StringBuilder testPalindromeString = new StringBuilder();
        testPalindromeString.append(number);

        StringBuilder convertTopalindrome = new StringBuilder();
        convertTopalindrome.append(testPalindromeString.substring(0, testPalindromeString.length()/2));

        convertTopalindrome.append(testPalindromeString.delete(testPalindromeString.length()/2,
            testPalindromeString.length()).reverse());

        //if the palindrome is greater than the original number
        if (Integer.parseInt(convertTopalindrome.toString()) > number) {
            System.out.println(" the next palindrome is " + convertTopalindrome);
        }
        else {
            //get the middle elements in case of even numbers
            String middleElements =
                convertTopalindrome.substring(convertTopalindrome.length()/2 - 1,
                    convertTopalindrome.length()/2 + 1);
            int middleElementsInt = Integer.valueOf(middleElements);
            //we are going to increment the middle elements by 1 so check if after this the value is not greater than 99.
            if (middleElementsInt + 11 < 99) {
                convertTopalindrome.replace(convertTopalindrome.length()/2 - 1,
                    convertTopalindrome.length()/2 + 1, String.valueOf(middleElementsInt + 11));
                System.out.println(" the next palindrome is " + convertTopalindrome);
            }
            else {
                String numberTillMiddleElement =
                    convertTopalindrome.substring(0, convertTopalindrome.length()/2 + 1);
                int numberTillMiddleElementInt = Integer.valueOf(numberTillMiddleElement);
                convertTopalindrome.replace(0, convertTopalindrome.length()/2 + 1,
                    String.valueOf(numberTillMiddleElementInt + 1));
                getNextPalindrome(Integer.valueOf(convertTopalindrome.toString()));
            }
        }
    }

    private static void getNextPalindromeForOddLengthNumbers(int number) {

        StringBuilder testPalindromeString = new StringBuilder();
        testPalindromeString.append(number);

        StringBuilder convertTopalindrome = new StringBuilder();
        convertTopalindrome.append(testPalindromeString.substring(0, testPalindromeString.length()/2 + 1));

        convertTopalindrome.append(testPalindromeString.delete(testPalindromeString.length()/2,
            testPalindromeString.length()).reverse());

        //if the palindrome is greater than the original number
        if (Integer.parseInt(convertTopalindrome.toString()) > number) {
            System.out.println(" the next palindrome is " + convertTopalindrome);
        }
        else {

            char middleElement = convertTopalindrome.charAt(convertTopalindrome.length()/2);
            int middleElementInt = Character.getNumericValue(middleElement);
            //we are going to increment the middle element by 1 so check if after this the value is not greater than 9.
            if (middleElementInt < 9) {
                convertTopalindrome.replace(convertTopalindrome.length()/2,
                    convertTopalindrome.length()/2 + 1, String.valueOf(middleElementInt + 1));
                System.out.println(" the next palindrome is " + convertTopalindrome);
            }
            else {
                String numberTillMiddleElement =
                    convertTopalindrome.substring(0, convertTopalindrome.length()/2 + 1);
                int numberTillMiddleElementInt = Integer.valueOf(numberTillMiddleElement);
                convertTopalindrome.replace(0, convertTopalindrome.length()/2 + 1,
                    String.valueOf(numberTillMiddleElementInt + 1));
                getNextPalindrome(Integer.valueOf(convertTopalindrome.toString()));
            }

        }

    }

}

The explanation for the code can be found here- Finding Next Palindrome using Java

2
қосылды
Кодекс әлдеқайда күрделі және тек 11 санға дейінгі сандар үшін ғана жұмыс істейді, бұл сұраққа сәйкес 100000 санға дейін емес.
қосылды автор Roland Illig, көзі

Мен осы питон кодында әрбір қадамның немен айналысқанын түсіндіру үшін түсініктемелерді жаздым.

Ескеру керек нәрсе - бұл кірістің өте үлкен болуы мүмкін, біз оған бүтін операцияларды жасай алмаймыз. Осылайша, енгізуді жол ретінде қабылдау, содан кейін оны басқару оңайырақ болады.

tests = int(input())
results = []
for i in range(0, tests):
    pal = input().strip()
    palen = len(pal)
    mid = int(palen/2)
    if palen % 2 != 0:
        if mid == 0: # if the number is of single digit e.g. next palindrome for 5 is 6 
            ipal = int(pal)
            if ipal < 9:
                results.append(int(pal) + 1)
            else:
                results.append(11) # for 9 next palindrome will be 11
        else:
            pal = list(pal)
            pl = l = mid - 1
            pr = r = mid + 1
            flag = 'n' # represents left and right half of input string are same
            while pl >= 0:
                if pal[pl] > pal[pr]:
                    flag = 'r' # 123483489 in this case pal[pl] = 4 and pal[pr] = 3 so we just need to copy left half in right half
                    break      # 123484321 will be the answer
                elif pal[pl] < pal[pr]:
                    flag = 'm' # 123487489 in this case pal[pl] = 4 and pal[pr] = 9 so copying left half in right half will make number smaller
                    break # in this case we need to take left half increment by 1 and the copy in right half 123494321 will be the anwere
                else:
                    pl = pl -1
                    pr = pr + 1
            if flag == 'm' or flag == 'n': # increment left half by one and copy in right half
                if pal[mid] != '9': # if mid element is < 9 the we can simply increment the mid number only and copy left in right half
                        pal[mid] = str(int(pal[mid]) + 1)
                        while r < palen:
                            pal[r] = pal[l]
                            r = r + 1
                            l = l - 1
                        results.append(''.join(pal))
                else: # if mid element is 9 this will effect entire left half because of carry
                    pal[mid] = '0' # we need to take care of large inputs so we can not just directly add 1 in left half
                    pl = l
                    while pal[l] == '9':
                        pal[l] = '0'
                        l = l - 1
                    if l >= 0:
                        pal[l] = str(int(pal[l]) + 1)
                    while r < palen:
                        pal[r] = pal[pl]
                        r = r + 1
                        pl = pl - 1
                    if l < 0:
                        pal[0] = '1'
                        pal[palen - 1] = '01'
                    results.append(''.join(pal))
            else:
                while r < palen: # when flag is 'r'
                    pal[r] = pal[l]
                    r = r + 1
                    l = l - 1
                results.append(''.join(pal))
    else: # even length almost similar concept here with flags having similar significance as in case of odd length input
        pal = list(pal)
        pr = r = mid
        pl = l = mid - 1
        flag = 'n'
        while pl >= 0:
            if pal[pl] > pal[pr]:
                flag = 'r'
                break
            elif pal[pl] < pal[pr]:
                flag = 'm'
                break
            else:
                pl = pl -1
                pr = pr + 1
        if flag == 'r':
            while r < palen:
                    pal[r] = pal[l]
                    r = r + 1
                    l = l - 1
            results.append(''.join(pal))
        else:
            if pal[l] != '9':
                pal[l] = str(int(pal[l]) + 1)
                while r < palen:
                    pal[r] = pal[l]
                    r = r + 1
                    l = l - 1
                results.append(''.join(pal))
            else:
                pal[mid] = '0'
                pl = l
                while pal[l] == '9':
                    pal[l] = '0'
                    l = l - 1
                if l >= 0:
                    pal[l] = str(int(pal[l]) + 1)
                while r < palen:
                    pal[r] = pal[pl]
                    r = r + 1
                    pl = pl - 1
                if l < 0:
                    pal[0] = '1'
                    pal[palen - 1] = '01'
                results.append(''.join(pal))

for xx in results:
    print(xx) 
1
қосылды
Мен түсініктеме беру үшін кодты түсініктеме бердім. Егер дауыс берудің нақты себептері бар болса немесе егер қандай да бір тестілік тапсырма орындалмаса, түсініктеме беріңіз.
қосылды автор quintin, көзі

HI Мұнда питон пайдаланатын тағы бір қарапайым алгоритм бар,

  def is_palindrome(n):
      if len(n) <= 1:
          return False
      else:
          m = len(n)/2
          for i in range(m):
              j = i + 1
              if n[i] != n[-j]:
                  return False
          return True

  def next_palindrome(n):
      if not n:
          return False
      else:
          if is_palindrome(n) is True:
              return n
          else:
             return next_palindrome(str(int(n)+1))

  print next_palindrome('1000010')
1
қосылды
Біз мұны істей алатынымызға сенімдіміз, бірақ сұхбат беруші функционалдық мүмкіндіктерді пайдалануға мүмкіндік бермейді.
қосылды автор James Sapam, көзі
Бұл тиімді шешім емес. Сондай-ақ, бұл палиндром екендігін тексеру үшін, біз оны пайдалана аламыз: str (a) == '' .join (reversed (str (a)))
қосылды автор coding_pleasures, көзі

Here is my code in java. Whole idea is from here http://www.geeksforgeeks.org/given-a-number-find-next-smallest-palindrome-larger-than-this-number/

import java.util.Scanner;

қоғамдық класс Негізгі {

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    System.out.println("Enter number of tests: ");
    int t = sc.nextInt();

    for (int i = 0; i < t; i++) {
        System.out.println("Enter number: ");
        String numberToProcess = sc.next();//ne proveravam dal su brojevi
        nextSmallestPalindrom(numberToProcess);
    }
}

private static void nextSmallestPalindrom(String numberToProcess) {


    int i, j;

    int length = numberToProcess.length();
    int[] numberAsIntArray = new int[length];
    for (int k = 0; k < length; k++)
        numberAsIntArray[k] = Integer.parseInt(String
                .valueOf(numberToProcess.charAt(k)));

    numberToProcess = null;

    boolean all9 = true;
    for (int k = 0; k < length; k++) {
        if (numberAsIntArray[k] != 9) {
            all9 = false;
            break;
        }
    }
   //case 1, sve 9ke
    if (all9) {
        whenAll9(length);
        return;
    }

    int mid = length/2;
    if (length % 2 == 0) {
        i = mid - 1;
        j = mid;
    } else {
        i = mid - 1;
        j = mid + 1;
    }

    while (i >= 0 && numberAsIntArray[i] == numberAsIntArray[j]) {
        i--;
        j++;
    }
   //case 2 already polindrom
    if (i == -1) {
        if (length % 2 == 0) {
            i = mid - 1;
            j = mid;
        } else {
            i = mid;
            j = i;
        }
        addOneToMiddleWithCarry(numberAsIntArray, i, j, true);

    } else {
       //case 3 not polindrom
        if (numberAsIntArray[i] > numberAsIntArray[j]) {//3.1)

            while (i >= 0) {
                numberAsIntArray[j] = numberAsIntArray[i];
                i--;
                j++;
            }
            for (int k = 0; k < numberAsIntArray.length; k++)
                System.out.print(numberAsIntArray[k]);
            System.out.println();
        } else {//3.2 like case 2
            if (length % 2 == 0) {
                i = mid - 1;
                j = mid;
            } else {
                i = mid;
                j = i;
            }
            addOneToMiddleWithCarry(numberAsIntArray, i, j, false);
        }
    }
}

private static void whenAll9(int length) {

    for (int i = 0; i <= length; i++) {
        if (i == 0 || i == length)
            System.out.print('1');
        else
            System.out.print('0');
    }
}

private static void addOneToMiddleWithCarry(int[] numberAsIntArray, int i,
        int j, boolean palindrom) {
    numberAsIntArray[i]++;
    numberAsIntArray[j] = numberAsIntArray[i];
    while (numberAsIntArray[i] == 10) {
        numberAsIntArray[i] = 0;
        numberAsIntArray[j] = numberAsIntArray[i];
        i--;
        j++;
        numberAsIntArray[i]++;
        numberAsIntArray[j] = numberAsIntArray[i];
    }

    if (!palindrom)
        while (i >= 0) {
            numberAsIntArray[j] = numberAsIntArray[i];
            i--;
            j++;
        }

    for (int k = 0; k < numberAsIntArray.length; k++)
        System.out.print(numberAsIntArray[k]);
    System.out.println();
}

}

1
қосылды
public class NextPalindrome 
{   
    int rev, temp;
    int printNextPalindrome(int n) 
    {
        int num = n;
        for (int i = num+1; i >= num; i++) 
        {
            temp = i;
            rev = 0;
            while (temp != 0) 
            {
                int remainder = temp % 10;
                rev = rev * 10 + remainder;
                temp = temp/10;
            }
            if (rev == i) 
            {
                break;
            }
        }
        return rev;
    }
    public static void main(String args[]) 
    {
        NextPalindrome np = new NextPalindrome();
        int nxtpalin = np.printNextPalindrome(11);
        System.out.println(nxtpalin);
    }



}
1
қосылды
бұл қорқынышты анс.
қосылды автор Mox, көзі

Мұны көріңіз

public static String genNextPalin(String base){
    //check if it is 1 digit
    if(base.length()==1){
        if(Integer.parseInt(base)==9)
            return "11";
        else
            return (Integer.parseInt(base)+1)+"";
    }
    boolean check = true;
    //check if it is all 9s
    for(char a: base.toCharArray()){
        if(a!='9')
            check = false;
    }
    if(check){
        String num = "1";
        for(int i=0; i
0
қосылды