亚马逊面试题目 最小的回文正整数
来源:互联网 发布:大数据基础知识 编辑:程序博客网 时间: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;
}
- 亚马逊面试题目 最小的回文正整数
- 亚马逊面试题目1
- 六道面试硅谷工程师的变态题目:Adobe、微软、亚马逊、谷歌 试试看吧! - IT公司面试手册
- 剑指offer面试题目:把数组排成最小的数
- 最小正整数
- Jay Huang:我的亚马逊面试经验
- Jay Huang:我的亚马逊面试经验
- 题目:丢失的第一个正整数
- 数组中未出现的最小正整数
- 数组中未出现的最小正整数
- 数组中未出现的最小正整数
- 数组中缺失的最小正整数
- 数组中为出现的最小正整数
- 数组中未出现的最小正整数
- 求数组里不存在的最小正整数
- 数组中未出现的最小正整数
- 正整数数组的最小不可组成和
- 数组中未出现的最小正整数
- liferay + struts2 + spring + ibatis整合开发案例
- linux awk命令详解
- java虚拟机
- log4j配置祥解
- 算法与数据结构面试题(6)-腾讯面试题
- 亚马逊面试题目 最小的回文正整数
- iOS 插件管理工具之Alcatraz插件剑客篇(欢迎提建议和分享经验)
- C++技术问题总结-第13篇 调用约定有哪些,有什么不同
- Zookeeper分布式集群搭建
- 特种浓缩分离:DTRO碟管式反渗透膜组件
- Android中的SharedPreferences存储数据方式
- PDF转Word方法小罗列
- NIO核心概念及基本读写及缓冲区的内部实现机制
- 【嵌入式linux】(第四步):安装NFS服务,并挂载到开发板