#include <bits/stdc++.h>
using namespace std;
char s[1005];
int D[20];
int main() {
scanf("%s", s);
//for(int i = 0; s[i]; ++ i)
// printf("D[%d]=%d \n", s[i] - '0',D[s[i] - '0']);
for(int i = 0; s[i]; ++ i)
++ D[s[i] - '0'];
for(int i = 0; s[i]; ++ i)
printf("D[%d]=%d \n", s[i] - '0',D[s[i] - '0']);
int minp = 0;
for(int i = 9; i >= 1; -- i)
if(D[i] <= D[minp]){
minp = i;
printf("D[%d]=%d D[%d]=%d minp=%d\n", i,D[i],minp,D[minp],minp);
}
if(minp == 0) {
putchar('1');
for(int i = 0; i <= D[minp]; ++ i)
putchar('0');
printf("D111[%d]=%d\n", minp,D[minp]);
} else {
printf("D222[%d]=%d\n", minp,D[minp]);
for(int i = 0; i <= D[minp]; ++ i)
printf("%d", minp);
}
puts("");
return 0;
}
这道题的题目:输入一串数字字符串,然后将这些数字进行组合,最后得到这些数字不能组合得到的最小的正整数
思路:首先统计这个字符串中每个字符出现的次数,这些数字包括0~9这10个数,然后从数字9到1,分别与0出现的次数倒序比较这些数字出现的次数,如果其中有一个数字出现的次数比0出现的次数还小,则将当前数字设置为标记,接着再往下比较,知道数字9至1中最后一个比当前数字出现次数更少的数字,然后做标记,如果9到1中的数字都出现过了,但0没有出现,则最小值是10,否则,若9到1中有数字没出现过,则最小值是该数字,否则,若9~0中的数字分别出现了好多次,则选择次数最少的一个数,然后该值出现了几次,重复输出几次,就得到出现次数最少的正整数