2016-11-10 11 views
0

Ich habe versucht, this Problem für das nächstgrößte Palindrom auf SPOJ zu lösen, aber es wirft mir einen Fehler Zeitlimit überschritten. Das ist mein Ansatz für das Problem in Python,Das nächste größte Palindrom einer Nummer finden

t = int(raw_input().strip()) 

for i in range(t): 
    a = raw_input() 
    a = str(int(a) + 1) 
    palin = "" 

    if (len(a) % 2 == 0): 

     reverseoffirst = [] 
     mainStr = a 

     firsthalf = mainStr[0:len(a)/2] 
     secondhalf = firsthalf[::-1] 

     palin = "".join(firsthalf) + "".join(secondhalf) 

     if (int(palin) < int(a)): 
      firsthalf = str(int(firsthalf) + 1) 
      secondhalf = firsthalf[::-1] 
      palin = "".join(firsthalf) + "".join(secondhalf) 


    else: 
     median = len(a)/2 
     mainStr = a 

     if(median == 0): 
      palin = "11" 

     else: 
      firsthalf = mainStr[0:median] 
      secondhalf = firsthalf[::-1] 

      palin = "".join(firsthalf) + mainStr[median] + "".join(secondhalf) 

      if (int(palin) < int(a)): 
       lastvalue = int(mainStr[median]) + 1 

       if (lastvalue == 10): 
        firsthalf = str(int(firsthalf) + 1) 
        secondhalf = firsthalf[::-1] 
        palin = firsthalf + "0" + secondhalf 

       else: 
        palin = firsthalf + str(lastvalue) + secondhalf 
    print palin 

Ich weiß, dass meine Frage bekommen könnte downvoted Duplikat von mehreren Fragen wie diese zu sein, aber mein Ansatz ist nicht überall kopiert. Deshalb wollte ich wissen, was mit meinem Code nicht stimmt.

Bitte, wenn Sie auf irgendeine Art und Weise hinweisen können, dass dieser Code besser oder irgendein Testfall, die es nicht erfüllt, oder jeder andere Ansatz, der sehr hilfreich für mich sein könnte. Vielen Dank!!

+0

Welchen Eingang verwenden Sie? –

+0

Ich habe viele Testfälle benutzt ........ aber alle meine Testfälle sind mit meinem Code zufrieden. zum Beispiel: 65973 und das nächste Palindrome wäre 66066. – Proloy

+0

Also, was ist deine Frage? –

Antwort

0

Ich nahm Ihren Code, und änderte es ein wenig, so dass Ihre Logik gleich ist.

Versuchen Sie es zu debuggen, so dass Sie die Funktionsweise besser verstehen.

Achten Sie darauf, dass es nur für Zahlen und nicht für Buchstaben funktioniert.

Grundsätzlich nach Ihrer Logik, ich, dass die von der ersten Hälfte mit der zweiten Hälfte ist das nächste Palindrom beitreten geprüft

Viel Glück

a = str(int(input())) # the initial number to check 
is_palin = False 
while True: 
    a = str(int(a) + 1) 
    if is_palin: 
     print palin 
     break 
    palin = "" 

    if (len(a) % 2 == 0): 

     reverseoffirst = [] 
     mainStr = a 

     firsthalf = mainStr[0:len(a)/2] 
     secondhalf = firsthalf[::-1] 

     palin = "".join(firsthalf) + "".join(secondhalf) 

     if (int(palin) == int(a)): 
      is_palin = True 
      print palin 


    else: 
     median = (len(a)/2) 
     mainStr = a 
     firsthalf = mainStr[0:median] 
     secondhalf = firsthalf[::-1] 
     palin = "".join(firsthalf) + mainStr[median] + "".join(secondhalf) 
     if (int(palin) == int(a)): 
      is_palin = True 
      print palin 

Output

+0

bitte überprüfen Sie mit 2133 sollte es 2222 als 2222 drucken ist es am nächsten Palindrom. – Proloy

+0

Nun, das Ergebnis ist 2222 .. @Proloy –

+0

gut ja ... aber dieser Code wird nicht gedruckt .. – Proloy

0

Vielleicht nicht die effiziente Methode überhaupt:

def IsPalindrome(n): 
     s = str(n) 
     l = len(s) 
     return s[:l/2] == s[:(l+1)/2-1:-1] 

def NextPalindrome(n): 
     while not IsPalindrome(n): 
       n += 1 
     return n 

Aber NextPalindrome(65973) gibt sofort 66066 zurück.

Verwandte Themen