现在的位置: 首页 > 综合 > 正文

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

2018年04月12日 ⁄ 综合 ⁄ 共 842字 ⁄ 字号 评论关闭

给定字符串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;
}

抱歉!评论已关闭.