牛客题单二----回文数的构造

发布时间:2024年01月24日

1、思路:玛德,纯纯细节题,拆东墙补西墙,终于AC

1、先输出只有长度为1的情况

2、输出所有无法构造的情况:

  • 前导0,就是偶数个0,只有一个其他数字
  • 多个数字是奇数情况比如1有3个,2有1个,两个数字是奇数情况

3、把所有偶数情况按数字本身的大小排序,若只有一个奇数情况,记录奇数情况的这个数字,让它数量减一变成偶数,成为偶数情况,与其他偶数一起从小到大排序

4、从小到达做一半?回文,加入这个奇数,再加上从大到小做的另一半回文

5、最后插入0,在第一个数字后面一位插入一半0,最后一个数字前面一位插入另一半0.

2、代码 附带注释

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
typedef pair<int,int> PII;
PII q1[10],q2[2],q3[2];
int main()
{
	int a[10];
	int res = 0;
	for(int i = 0;i<10;i++) scanf("%d",&a[i]),res += a[i]; // 输入十个数字,并统计长度 
	// 不能构造的情况
	int cnt = 0,pt = 0,k1 = 0,k2 = 0,k3 = 0;// k1存偶数,k2存奇数,k3存0的数量 ,cnt存放奇数的数量 
	for(int i = 0;i<10;i++)
	{
		if(a[i]%2==1&&a[i]>=1){ // 如果是奇数并且大于等于1 
			cnt++;         // 统计奇数的个数 
			pt = i;       // 记录那个奇数  
			if(i!=0&&a[i]>1)      // 不是0的奇数个数减一变成偶数,放入q1中 ,,非0数奇数变偶数 
				q1[k1++] = {i,a[i]-1}; 
			q2[k2++] = {i,a[i]};  //  让q2中的奇数入队 
		}
		else if(i!=0&&a[i]%2==0&&a[i]!=0)  // 不是0且偶数,入q1队 
		{
			q1[k1++] = {i,a[i]};
		}
		if(i==0&&a[i]!=0)   // 如果是0 则直接入q3队,无论奇数偶数 
		{
			q3[k3++] = {i,a[i]};
		}
	}
	if(cnt==1&&res==1&&a[0]!=0) // 输出只有一个0的情况 
	{
		cout<<0<<endl;
		return 0;
	}
	if(cnt==1&&res==1&&a[0]==0) // 输出只有一个其他数字的情况 ,只有一个其他数字,必然该数字在q2的第一个里面 
	{
		cout<<q2[0].first<<endl;
		return 0;
	}

	if(cnt>1||q1[0].second==0)   // 无效的情况则是 奇数的数量大于1,有前导0,前导0对应的情况是多个0并且一个其他位数 
	{// 这一个其他位数是1,当然也是奇数,因此放入q1中变成个数为0 
		cout<<"-1"<<endl;
		return 0;
	}
	sort(q1,q1 + k1);  //所有非0的数从小到大排列 
	string s = "";
	if(k2==1&&q2[0].second==1||q2[0].second>=3)   s += string(1,pt + '0'); // 如果有奇数的情况,先加入一个奇数 
	string s1 = "";// 再定义一个字符串 
	for(int i = 0;i<k1;i++)	s1 += string(q1[i].second/2,q1[i].first+'0');  // 正的加入一次 

	s1 += s;
	for(int i = k1-1;i>=0;i--)s1 += string(q1[i].second/2,q1[i].first+'0');  // 反着加入一次 
	if(k3==1) s1.insert(1,q3[0].second/2,'0'),s1.insert(s1.size()-1,q3[0].second/2,'0');   // 最后把多余的0在首后尾前加入 
	cout<<s1<<endl;
	return 0;
		
} 

文章来源:https://blog.csdn.net/atm7758258/article/details/135796224
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。