写在前面

  • 正确立即题目
  • permutation: 排列(方式);组合(方式)
  • 通用方法
  • 循环遍历计算结果,拼成字符串
  • map封装大数字符次数结果,循环比较倍数结果与原数字符个数及种类
  • 不手生的情况下,10分钟内a题

测试用例

input:
1234567899
output:
Yes
2469135798

ac代码

  • 时间长手生,撸代码时间耗费偏多
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
string in_num, res_num;
cin >> in_num;

int yushu = 0, tp_num=0;
map<char, int> in_map, res_map;
for(int i=in_num.size()-1; i>=0; i--)
{
tp_num = (in_num[i]-'0')*2;
res_num += (yushu + tp_num%10 + '0');

in_map[in_num[i]] +=1;
res_map[yushu + tp_num%10 + '0'] +=1;

yushu = tp_num/10;
}
if(yushu>0) res_num += (yushu+'0');
reverse(res_num.begin(), res_num.end());

string res_flag="Yes";
if(res_num.size()!=in_num.size()) res_flag = "No";

for(int i=0; i<in_num.size(); i++)
{
if(in_map[in_num[i]]!=res_map[in_num[i]])
{
res_flag = "No";
break;
}
}
cout << res_flag << endl;
cout << res_num;

return 0;
}
  • 部分优化
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{

string in_num, res_num;
cin >> in_num;
int yushu = 0, tp_num=0;
map<char, int> in_map;
for(int i=in_num.size()-1; i>=0; i--)
{
tp_num = (in_num[i]-'0')*2;
res_num += (yushu + tp_num%10 + '0');

in_map[in_num[i]] +=1;
in_map[yushu + tp_num%10 + '0'] -=1;

yushu = tp_num/10;
}
if(yushu>0) res_num += (yushu+'0');
reverse(res_num.begin(), res_num.end());

string res_flag="Yes";
if(res_num.size()!=in_num.size()) res_flag = "No";

for(int i=0; i<in_num.size(); i++)
{
if(in_map[in_num[i]]!=0)
{
res_flag = "No";
break;
}
}

printf("%s\n", res_flag.c_str());
printf("%s", res_num.data());

return 0;
}

参考代码

  • int book[10];
  • 循环统计。原数字符出现次数做加法,倍数结果字符出现次数做减法,最后结果为0,则Yes;否则为No
  • 优点: 节省资源、算力
#include <cstdio>
#include <string.h>
using namespace std;
int book[10];
int main() {
char num[22];
scanf("%s", num);
int flag = 0, len = strlen(num);
for(int i = len - 1; i >= 0; i--) {
int temp = num[i] - '0';
book[temp]++;
temp = temp * 2 + flag;
flag = 0;
if(temp >= 10) {
temp = temp - 10;
flag = 1;
}
num[i] = (temp + '0');
book[temp]--;
}
int flag1 = 0;
for(int i = 0; i < 10; i++) {
if(book[i] != 0)
flag1 = 1;
}
printf("%s", (flag == 1 || flag1 == 1) ? "No\n" : "Yes\n");
if(flag == 1) printf("1");
printf("%s", num);
return 0;
}