您的位置:首页 > 其它

【全排列】亚马逊在线测试-找下一个回文字符串

2014-10-09 18:19 323 查看
给定字符串s[len],求下一个回文字符串

例如 

123 =》 131

321 =》 323

121 =》 131

191 =》 202

999 =》 1001

也就是从i=0到(len-1)/2扫描,

如果a[j=len-1-i]不等于a[i],则令a[j]=a[i],如果a[j]变大,说明当前串变大。否则,当前串变小。

扫描到头检查当前串是变大还是变小还是没变。

如果变大,则直接返回。
否则,令a[i=(len-1)/2]和a[j=len-1-i]自增。如果增加后溢出,则置为0,向外(从中間向两边)进位。
需要注意,当进位进到超过a[0]时,说明当前串长度需要变化(+1),并变成100....01的形式。

/*
* Complete the function below.
*/
#include <iostream>
using namespace std;

string getNextSymmetricNumber(string n) {
int len=n.length();
bool bigger=false;
for(int i=0;i<=(len-1)/2;i++){
int j=len-i-1;
if(n[i]!=n[j]) {
if(n[i]<n[j]){
n[j]=n[i];
bigger=false;
}
else{
n[j]=n[i];
bigger=true;
}
}
}

if(bigger) return n;

for(int i=(len-1)/2;i>=0;i--){
n[i]=++n[len-1-i];
if(n[i]>'9'){
n[i]=n[len-1-i]='0';
}
else break;
}
if(n[0]=='0'){//最高位发生进位
string t="1";
for(int i=0;i<len-1;i++)
t+='0';
t+='1';
return t;
}
return n;
}

int main(){
string s;//="130";
cin>>s;
cout<<getNextSymmetricNumber(s)<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: