列表

详情


MT43. 数字字符

描述

在十进制表示中,任意一个正整数都可以用字符 ’0’-‘9’ 表示出来。但是当 ’0’-‘9’ 这些字符每种字符的数量有限时,可能有些正整数就无法表示出来了。比如你有两个 ‘1’ ,一个 ‘2’ ,那么你能表示出 11,12,121 等等,但是无法表示出 10,122,200 等数。
现在你手上拥有一些字符,它们都是 ’0’-‘9’ 的字符。你可以选出其中一些字符然后将它们组合成一个数字,那么你所无法组成的最小的正整数是多少?

数据范围:字符串长度满足 ,字符串中只包含 '0'-'9' 字符。

输入描述

第一行包含一个字符串,表示你可以使用的字符。

输出描述

输出你所无法组成的最小正整数

示例1

输入:

55

输出:

1

示例2

输入:

123456789

输出:

10

原站题解

C++ 解法, 执行用时: 2ms, 内存消耗: 488KB, 提交时间: 2021-11-12

#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <cstring>

using namespace std;

int count_days(vector<int> & flowers){
    int n = flowers.size(), ret = 0;
    stack<int> st;
    vector<int> left(n), right(n, n);
    for(int i=0; i<n; ++i){
        while(!st.empty() && flowers[i] < flowers[st.top()]){
            right[st.top()] = i;
            st.pop();
        }
        left[i] = st.empty() ? -1 : st.top();
        st.push(i);
    }
    // for(int i=0;i<n;++i)cout<<left[i]<<" ";cout<<endl;
    // for(int i=0;i<n;++i)cout<<right[i]<<" ";cout<<endl;
    for(int i=0; i<n; ++i){
        int l = left[i] == -1 ? 0 : flowers[left[i]];
        int r = right[i] == n ? 0 : flowers[right[i]];
        ret += flowers[i] - max(l, r);
    }
    return ret;
}

string min_not_p(string str){
    vector<int> cnt(10, 0);
    for(int i=0; i<str.length(); ++i){
        ++cnt[str[i]-'0'];
    }
    string ret = "";
    cnt[0] += 1;
    int minn = 9999999, idx=-1;
    for(int i=0;i<10;++i){
        if(cnt[i] < minn){
            minn = cnt[i];
            idx = i;
        }
    }
    for(int i=0; i<minn; ++i){
        ret += to_string(idx);
    }
    ret = idx == 0 ? to_string(1) + ret : ret + to_string(idx);
    return ret;
}

int main(){
    int n;
    // while(cin >> n){
    //     vector<int> vec(n);
    //     for(int i = 0; i < n; ++i)cin >> vec[i];
    //     cout<<count_days(vec)<<endl;
    // }
    string nums;
    while(cin>>nums){
        cout<<min_not_p(nums)<<endl;
    }
    return 0;
}

C 解法, 执行用时: 3ms, 内存消耗: 348KB, 提交时间: 2019-01-28

#include<stdio.h>

int main(){
    int a[10]={0,0,0,0,0,0,0,0,0,0};
    char c;
    while((c=getchar())!=EOF){
        a[c-48]++;
    }
    int t=1;
    for(int i=1;i<10;i++){
        if(a[i]<a[t]){
            t=i;
        }
    }
    for(int i=0;i<=a[t];i++){
        putchar(t+48);
    }
}

上一题