亚马逊面试题目 最小的回文正整数

来源:互联网 发布:大数据基础知识 编辑:程序博客网 时间:2024/05/24 07:45

题目要求:给定正整数 N,求其 下一个最小的回文正整数。比如,N=9,则下一个所求之数为11。又如N=12444,则下一个所求之数为12521. 

下面给出了两种实现方法 GetFirstBiggerPalindromeV2是本博主写的,而GetFirstBiggerPalindrome()是网友写的。

 

#include < cstdlib >
#include < cstdio >
#include < cstring >
#include < iostream >
#include < string >
#include < algorithm >
#include < sstream >

using namespace std;

void test(){
  std::stringstream ss;
  ss<<12345;
  int m=0;
  ss >> m;
  cout<<m<<endl;
 
  string str("");
  str=ss.str();
  cout<<str<<endl;
  string str1("abc");
  ////在进行多次转换前,必须调用 stringstream::clear()
  ss.clear();
   ss << str1;
   str=ss.str();
   cout<<str<<endl;
  
   ss.clear();
   ss.str("");
   str=ss.str();
   cout<<"final="<<str<<endl;
}
int GetFirstBiggerPalindromeV2(int givenumber) {
 if(givenumber <=0)
     return 0;
  std::stringstream ss;
  ss<<givenumber;
  string numberstring=ss.str();
  //digits
  int len=numberstring.length();
  bool odd=false;
 
  if(len%2==1)
      odd=true;
 
  string leftstr(""),rightstr(""),reverseleftstr("");
  int leftnum,rightnum,reserveleft;
 
  if(len>1) {
  leftstr.append(numberstring,0,len/2);
  if(odd)
    rightstr.append(numberstring,(len/2)+1,len/2);
  else
    rightstr.append(numberstring,len/2,len/2);
 
  reverseleftstr=leftstr;
  reverse(reverseleftstr.begin(),reverseleftstr.end());
 
  //must clear for ss via clear() and str("");
  //clear() just clear out flags of stringstream.
  ss.clear();
  ss.str("");
  ss<<leftstr;
  ss>>leftnum;
 
  ss.clear();
  ss.str("");
  ss<<rightstr;
  ss>>rightnum;
 
  ss.clear();
  ss.str("");
  ss<<reverseleftstr;
  ss>>reserveleft;
  }
  int resultnum;
  string resultstring;
 
  if(odd){
      if(len==1) {
            ss.clear();
            ss.str("");
          ss<<numberstring;
          ss>>resultnum;
         
          if(resultnum==9)
              resultnum=11;
          else
              resultnum++;
         }
      else { //len>1
          char pchar=numberstring.at(len/2);
          int middlevalue=pchar-'0';
          if(reserveleft < rightnum){
           if(middlevalue<9) {
               pchar++;              
           } else {
               pchar='0';
               leftnum++;
               ss.clear();
               ss.str("");
               ss<<leftnum;
               leftstr=ss.str();
              
               reverseleftstr=leftstr;
               reverse(reverseleftstr.begin(),reverseleftstr.end());
           }          
          }
         resultstring=leftstr;
         resultstring.append(1,pchar);
         resultstring += reverseleftstr;
         ss.clear();
         ss.str("");
         ss<<resultstring;
         ss>>resultnum;
      }
   }
 
  if(!odd) {
       if(reserveleft < rightnum) {
        //re-make left str
        leftnum++;
        ss.clear();
        ss.str("");
        ss<<leftnum;
        leftstr=ss.str();
        reverseleftstr=leftstr;
        reverse(reverseleftstr.begin(),reverseleftstr.end());
       }
       resultstring=leftstr;
       resultstring += reverseleftstr;
      
       ss.clear();
       ss.str("");
       ss<<resultstring;
       ss>>resultnum;
   }
  cout<<"V2 result="<<resultnum<<endl;
  return resultnum;
}

int GetFirstBiggerPalindrome(int givenumber) {
  
    if(givenumber <=0)
     return 0;
   
    char strnumber[100]={0};
    bool odd=true;
    int numberdigit=0,middle=0;
          
    sprintf(strnumber,"%d",givenumber);
    numberdigit=strlen(strnumber);
    cout<<"number="<<strnumber<<" digits="<<numberdigit<<endl;
   
     middle=numberdigit/2;
    if((numberdigit%2)==1) {
        odd=true;
        middle++;
    }
    else
        odd=false;
 
    char leftstr[100]={0};
    char rightstr[100]={0};
    char leftreversestr[100]={0};
   
    int leftnumber=0,rightnumber=0,leftreverse=0;
    char middlenum;
    int index=0;
    int mid_position;
   
     if(odd)
        mid_position=middle-1;
     else
        mid_position=middle;
   
    for(index=0;index
       leftstr[index]= strnumber[index];
       leftreversestr[ mid_position-1-index]=leftstr[index];
    }
    leftstr[index]='\0';
    leftreversestr[index]='\0';
   
    leftnumber=atoi(leftstr);
    leftreverse=atoi(leftreversestr);
   
    for(index=middle; index< numberdigit; index++){
       rightstr[index - middle]= strnumber[index];
    }
     rightstr[index]='\0';
     rightnumber=atoi(rightstr);
   
     char finalstr[100]={0};
     char *ptr=0;
     int resultNumber=0;
    
     if(odd){
         if(numberdigit==1){
             middlenum=strnumber[middle-1];
             resultNumber=middlenum-'0';
            if(resultNumber<9)
                resultNumber++;
            else
                resultNumber=11;
         }
         //multi digits >=3
         else {
           middlenum=strnumber[middle-1];
           if(leftreverse < rightnumber) {
            if(middlenum < '9' ){
               middlenum++;
               strcpy(finalstr,leftstr);
               finalstr[middle-1]=middlenum;
               ptr=finalstr + middle;
               strcpy(ptr,leftreversestr);
               resultNumber=atoi(finalstr);
           }
           //==9          
           else {
                middlenum='0';
                leftnumber++;
                //remake the reverse left
                sprintf(leftstr,"%d",leftnumber);
                int length=strlen(leftstr);
                for(index=0;index
                  leftreversestr[length-1-index]=leftstr[index];
                }
                leftreversestr[index]='\0';
                strcpy(finalstr,leftstr);
                finalstr[middle-1]=middlenum;
                ptr=finalstr + middle;
                strcpy(ptr,leftreversestr);
               resultNumber=atoi(finalstr);
            }
        }
       else { //left>=right
               strcpy(finalstr,leftstr);
               finalstr[middle-1]=middlenum;
               ptr=finalstr + middle;
               strcpy(ptr,leftreversestr);
               resultNumber=atoi(finalstr);
        }
       }
     }
    
     //even
     if(!odd) {
          if(leftreverse < rightnumber){
              leftnumber++;
               sprintf(leftstr,"%d",leftnumber);
               int length=strlen(leftstr);
               for(index=0;index
                  leftreversestr[length-1-index]=leftstr[index];
                }
               
                leftreversestr[index]='\0';
                strcpy(finalstr,leftstr);
                ptr=finalstr + middle;
                strcpy(ptr,leftreversestr);
               resultNumber=atoi(finalstr);
          }
          //leftreverse > right, make directly
          else {
              strcpy(finalstr,leftstr);
              ptr=finalstr + middle;
              strcpy(ptr,leftreversestr);
              resultNumber=atoi(finalstr);
          }
     }
       
    cout<<"final number="<<resultNumber<<endl;
   return  resultNumber;
}

int main(int argc, char** argv) {
  

      GetFirstBiggerPalindrome(12456);
      GetFirstBiggerPalindromeV2(12456);
     
      GetFirstBiggerPalindrome(12320);
      GetFirstBiggerPalindromeV2(12320);
      
      GetFirstBiggerPalindrome(12923);
      GetFirstBiggerPalindromeV2(12923);
         
      GetFirstBiggerPalindrome(1234);
      GetFirstBiggerPalindromeV2(1234);
     
      GetFirstBiggerPalindrome(8);
      GetFirstBiggerPalindromeV2(8);
     
      
    return 0;
}

 

0 0
原创粉丝点击