Java 查找数字字符串下一个回文的更好算法

Java 查找数字字符串下一个回文的更好算法,java,algorithm,palindrome,Java,Algorithm,Palindrome,首先,问题是: 如果从左到右和从右到左读取时,正整数在十进制中的表示形式相同,则称为回文。对于给定的不超过1000000位的正整数K,将大于K的最小回文值写入输出。显示的数字始终不带前导零 输入:第一行包含整数t,测试用例数。整数K在接下来的t行中给出 输出:对于每个K,输出大于K的最小回文。 范例 输入: 二, 808 2133 输出: 818 2222 其次,这是我的代码: // I know it is bad practice to not cater for erroneous inp

首先,问题是:

如果从左到右和从右到左读取时,正整数在十进制中的表示形式相同,则称为回文。对于给定的不超过1000000位的正整数K,将大于K的最小回文值写入输出。显示的数字始终不带前导零

输入:第一行包含整数t,测试用例数。整数K在接下来的t行中给出

输出:对于每个K,输出大于K的最小回文。 范例

输入:

二,

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
}
这个问题来自在线法官系统spoj.pl。我的代码适用于所有测试,但当我提交它时,我收到一个超过时间限制的错误,我的答案不被接受


有人对我如何改进算法有什么建议吗。在写这个问题时,我认为我可以使用一个布尔值来代替While(offset==0&&offsetUpdated)循环,以确保在下一次[i]迭代中增加偏移量。如果您能确认我的更改或任何建议,我们将不胜感激。如果我需要澄清我的问题,请告诉我。

这似乎有很多代码。你尝试过一种非常幼稚的方法吗?检查某个内容是否是回文实际上非常简单

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;
        }
    }
}
现在,如果速度不够快,您可以将其用作参考实现,并致力于降低算法复杂性

实际上应该有一个固定的时间(它与输入的位数成线性关系)来找到下一个最大的回文。我将给出一个算法,该算法假设该数字是偶数位数(但可以扩展到奇数位数)

  • 查找输入数字的十进制表示形式(“2133”)
  • 将其分为左半部分和右半部分(“21”、“33”)
  • 比较左半部分的最后一个数字和右半部分的第一个数字。
    A.如果右侧大于左侧,则增加左侧并停止。(“22”)
    B如果右侧小于左侧,则停止。
    C如果右侧等于左侧,则重复步骤3,最后一个数字在左侧,第二个数字在右侧(依此类推)
  • 取左半部分,将左半部分反向附加。这是你下一个最大的回文。(“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
    

    这似乎有点类似于您描述的算法,但它从内部数字开始,然后移到外部。

    我有一个恒定的顺序解决方案(至少是k阶,其中k是数字中的位数)

    让我们举几个例子 假设n=17208

    把数字从中间分成两部分 将最重要的部分可逆地写在不重要的部分上。 17271 如果生成的数字大于你的n则是你的回文,如果不只是增加中心数字(枢轴),即得到17371

    其他例子

    n=17286 palidrome尝试=17271(因为它小于轴的n增量,在本例中为2) 所以palidrome=17371

    n=5684 栅栏1=5665 palidrome=5775

    n=458322 回文=458854

    现在假设n=1219901 栅栏1=1219121 增加轴心使我的数字在这里变小 因此,也要增加相邻轴的数量 1220221

    这个逻辑可以扩展

    试试这个

    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<base.length()-1; i++)
                num+="0";
            num+="1";
            return num;
        }
    
        boolean isBasePalin = isPalindrome(base);
        int mid = base.length()/2;
        if(isBasePalin){
            //if base is palin and it is odd increase mid and return
            if(base.length()%2==1){
                BigInteger leftHalf = new BigInteger(base.substring(0,mid+1));
                String newLeftHalf = leftHalf.add(BigInteger.ONE).toString();
                String newPalin = genPalin2(newLeftHalf.substring(0,mid),newLeftHalf.charAt(mid));
                return newPalin;
            }
            else{
                BigInteger leftHalf = new BigInteger(base.substring(0,mid));
                String newLeftHalf = leftHalf.add(BigInteger.ONE).toString();
                String newPalin = genPalin(newLeftHalf.substring(0,mid));
                return newPalin;
            }
        }
        else{
            if(base.length()%2==1){
                BigInteger leftHalf = new BigInteger(base.substring(0,mid));
                BigInteger rightHalf = new BigInteger(reverse(base.substring(mid+1,base.length())));
    
                //check if leftHalf is greater than right half
                if(leftHalf.compareTo(rightHalf)==1){
                    String newPalin = genPalin2(base.substring(0,mid),base.charAt(mid));
                    return newPalin;
                }
                else{
                    BigInteger leftHalfMid = new BigInteger(base.substring(0,mid+1));
                    String newLeftHalfMid = leftHalfMid.add(BigInteger.ONE).toString();
                    String newPalin = genPalin2(newLeftHalfMid.substring(0,mid),newLeftHalfMid.charAt(mid));
                    return newPalin;
                }
            }
            else{
                BigInteger leftHalf = new BigInteger(base.substring(0,mid));
                BigInteger rightHalf = new BigInteger(reverse(base.substring(mid,base.length())));
    
                //check if leftHalf is greater than right half
                if(leftHalf.compareTo(rightHalf)==1){
                    return genPalin(base.substring(0,mid));
                }
                else{
                    BigInteger leftHalfMid = new BigInteger(base.substring(0,mid));
                    String newLeftHalfMid = leftHalfMid.add(BigInteger.ONE).toString(); 
                    return genPalin(newLeftHalfMid);
                }
            }
        }
    }
    
    public static String genPalin(String base){
        return base + new StringBuffer(base).reverse().toString();
    }
    public static String genPalin2(String base, char middle){
        return base + middle +new StringBuffer(base).reverse().toString();
    }
    
    public static String reverse(String in){
        return new StringBuffer(in).reverse().toString();
    }
    
    static boolean isPalindrome(String str) {    
        int n = str.length();
        for( int i = 0; i < n/2; i++ )
            if (str.charAt(i) != str.charAt(n-i-1)) 
                return false;
        return true;    
    }
    
    公共静态字符串gennextpain(字符串基){
    //检查是否为1位数字
    if(base.length()==1){
    if(Integer.parseInt(base)==9)
    返回“11”;
    其他的
    return(Integer.parseInt(base)+1)+“”;
    }
    布尔检查=真;
    //检查是否都是9
    for(char a:base.toCharArray()){
    如果(a!='9')
    检查=错误;
    }
    如果(检查){
    字符串num=“1”;
    
    对于(int i=0;i简单代码和测试输出:

    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<a.length; i++)
            {
                int add = findNextPalin(a[i]);
                System.out.println( a[i] + "  +  "  + add +  "  = "  + (a[i]+add)  );
            }
        }
        catch( Exception e ){}
    }
    
    static int findNextPalin( int a ) throws Exception
    {
        if( a < 0 ) throw new Exception();
        if( a < 10 ) return a;
    
        int count = 0, reverse = 0, temp = a;
        while( temp > 0 ){
            reverse = reverse*10 + temp%10;
            count++;
            temp /= 10;
        }
    
        //compare 'half' value
        int halfcount = count/2;
        int base = (int)Math.pow(10, halfcount );
        int reverseHalfValue = reverse % base;
        int currentHalfValue = a % base;
    
        if( reverseHalfValue == currentHalfValue ) return 0;
        if( reverseHalfValue > currentHalfValue )  return  (reverseHalfValue - currentHalfValue);
    
        if(  (((a-currentHalfValue)/base)%10) == 9 ){
            //cases like 12945 or 1995
            int newValue = a-currentHalfValue + base*10;
            int diff = findNextPalin(newValue);
            return base*10 - currentHalfValue + diff;
        }
        else{
            return (base - currentHalfValue + reverseHalfValue );
        }
    }
    }
    
    $ java NextPalin
    2  +  2  = 4
    23  +  9  = 32
    88  +  0  = 88
    234  +  8  = 242
    432  +  2  = 434
    464  +  0  = 464
    7887  +  0  = 7887
    7657  +  10  = 7667
    34567  +  76  = 34643
    99874  +  25  = 99899
    7779222  +  555  = 7779777
    2569981  +  9771  = 2579752
    3346990  +  443  = 3347433
    229999  +  9933  = 239932
    2299999  +  9033  = 2309032
    
    class-nextpain
    {
    公共静态void main(字符串[]args)
    {
    试一试{
    int[]a={2,23,88,234,432,464,7887,7657,34567,99874,7779222,2569981,3346990,2299999};
    对于(int i=0;i 0){
    反向=反向*10+温度%10;
    计数++;
    温度/=10;
    }
    //比较“一半”值
    int halfcount=计数/2;
    int base=(int)Math.pow(10,半计数);
    int reverseehalfvalue=反向%base;
    int currentHalfValue=a%基数;
    如果(reverseHalfValue==currentHalfValue)返回0;
    如果(reverseHalfValue>currentHalfValue)返回(reverseHalfValue-currentHalfValue);
    如果(((a-currentHalfValue)/base)%10)==9){
    //12945或1995等个案
    int newValue=a-currentHalfValue+base*10;
    int diff=findNextPalin(newValue);
    返回基数*10-当前半值+差值;
    }
    否则{
    返回值(基本-当前半值+反向半值);
    }
    }
    }
    $java NextPalin
    2  +  2  = 4
    23  +  9  = 32
    88  +  0  = 88
    234  +  8  = 242
    432  +  2  = 434
    464  +  0  = 464
    7887  +  0  = 7887
    7657  +  10  = 7667
    34567  +  76  = 34643
    99874  +  25  = 99899
    7779222  +  555  = 7779777
    2569981  +  9771  = 2579752
    3346990  +  443  = 3347433
    229999  +  9933  = 239932
    2299999  +  9033  = 2309032
    
    嗨,这里是另一个使用python的简单算法

      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')
    
    def是回文(n):
    
    如果len(n)这是我用java编写的代码。整个想法来自

    import java.util.Scanner;
    公共班机{
    公共静态void main(字符串[]args){
    扫描仪sc=新的扫描仪(System.in);
    System.out.println(“输入测试次数:”);
    int t=sc.nextInt();
    for(int i=0;i  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')
    
    import java.util.Scanner;
    
    public class Main {
    
        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();
        }
    
    }
    
    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);
        }
    
    
    
    }
    
    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) 
    
    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"));
        }
    }
    
    private void findNextPalindrom(int i) {
        i++;
        while (!checkPalindrom(i)) {
            i++;
        }
        Log.e(TAG, "findNextPalindrom:next palindrom is===" + i);
    }
    
    
    private boolean checkPalindrom(int num) {
        int temp = num;
        int rev = 0;
        while (num > 0) {
            int rem = num % 10;
            rev = rev * 10 + rem;
            num = num / 10;
        }
        return temp == rev;
    }