解题思路

完整思路:

  1. 使用 统计每个数字出现次数
  2. 将统计结果按照出现次数和数字大小排序
  3. 根据最小出现次数的数字情况分类处理:
    • 如果最小次数为 ,需要特殊处理
    • 如果最小次数的是 ,使用次小的数字
    • 否则使用最小次数的数字重复

代码

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    string s;
    cin >> s;
    
    // 初始化计数数组
    vector<pair<int, int>> digitCount;
    for(int i = 0; i < 10; i++) {
        digitCount.push_back({i, 0});
    }
    
    // 统计每个数字出现次数
    for(char c : s) {
        digitCount[c - '0'].second++;
    }
    
    // 按照出现次数和数字大小排序
    sort(digitCount.begin(), digitCount.end(), 
        [](const pair<int, int>& a, const pair<int, int>& b) {
            if(a.second == b.second) return a.first < b.first;
            return a.second < b.second;
        });
    
    // 获取最小和次小出现次数的数字
    auto firstEntry = digitCount[0];
    auto secondEntry = digitCount[1];
    
    string result;
    if(firstEntry.second == 0) {
        // 如果最小次数为0
        if(firstEntry.first == 0) {
            if(secondEntry.second == 0) {
                result = to_string(secondEntry.first);
            } else {
                result = "10";
            }
        } else {
            result = to_string(firstEntry.first);
        }
    } else {
        // 如果最小次数不为0
        if(firstEntry.first == 0) {
            // 使用次小的数字
            for(int i = 0; i <= secondEntry.second; i++) {
                result += to_string(secondEntry.first);
            }
        } else {
            // 使用最小的数字
            for(int i = 0; i <= firstEntry.second; i++) {
                result += to_string(firstEntry.first);
            }
        }
    }
    
    cout << result << endl;
    return 0;
}
import java.util.*;

public class Main {
    private static HashMap<Integer, Integer> digitMap = new HashMap<Integer, Integer>() {{
        for(int i = 0; i < 10; i++) {
            put(i, 0);
        }
    }};
    
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()) {
            solution(in);
        }
    }
    
    private static void solution(Scanner in) {
        String digits = in.nextLine();
        
        // 统计每个数字出现次数
        for(char ch : digits.toCharArray()) {
            int digit = ch - '0';
            digitMap.put(digit, digitMap.get(digit) + 1);
        }
        
        // 将统计结果转换为列表并排序
        List<Map.Entry<Integer, Integer>> digitCountList = 
            new ArrayList<>(digitMap.entrySet());
        
        Collections.sort(digitCountList, (o1, o2) -> {
            if(o1.getValue().equals(o2.getValue())) {
                return o1.getKey() - o2.getKey();
            } else {
                return o1.getValue() - o2.getValue();
            }
        });
        
        // 获取最小和次小出现次数的数字
        Map.Entry<Integer, Integer> firstEntry = digitCountList.get(0);
        Map.Entry<Integer, Integer> secondEntry = digitCountList.get(1);
        
        StringBuilder sb = new StringBuilder();
        if(firstEntry.getValue() == 0) {
            // 如果最小次数为0
            if(firstEntry.getKey() == 0) {
                if(secondEntry.getValue() == 0) {
                    sb.append(secondEntry.getKey());
                } else {
                    sb.append(10);
                }
            } else {
                sb.append(firstEntry.getKey());
            }
        } else {
            // 如果最小次数不为0
            if(firstEntry.getKey() == 0) {
                // 使用次小的数字
                for(int i = 0; i <= secondEntry.getValue(); i++) {
                    sb.append(secondEntry.getKey());
                }
            } else {
                // 使用最小的数字
                for(int i = 0; i <= firstEntry.getValue(); i++) {
                    sb.append(firstEntry.getKey());
                }
            }
        }
        
        System.out.println(sb);
        
        // 重置计数
        for(int i = 0; i < 10; i++) {
            digitMap.put(i, 0);
        }
    }
}
def solve():
    digits = input().strip()
    
    # 初始化计数字典
    digit_map = {i: 0 for i in range(10)}
    
    # 统计每个数字出现次数
    for ch in digits:
        digit_map[int(ch)] += 1
    
    # 将统计结果转换为列表并排序
    digit_count_list = list(digit_map.items())
    digit_count_list.sort(key=lambda x: (x[1], x[0]))
    
    # 获取最小和次小出现次数的数字
    first_entry = digit_count_list[0]
    second_entry = digit_count_list[1]
    
    result = []
    if first_entry[1] == 0:
        # 如果最小次数为0
        if first_entry[0] == 0:
            if second_entry[1] == 0:
                result.append(str(second_entry[0]))
            else:
                result.append("10")
        else:
            result.append(str(first_entry[0]))
    else:
        # 如果最小次数不为0
        if first_entry[0] == 0:
            # 使用次小的数字
            result.extend([str(second_entry[0])] * (second_entry[1] + 1))
        else:
            # 使用最小的数字
            result.extend([str(first_entry[0])] * (first_entry[1] + 1))
    
    print("".join(result))

if __name__ == "__main__":
    solve()

算法及复杂度

  • 算法:排序 + 模拟
  • 时间复杂度:,主要是排序的复杂度
  • 空间复杂度:,只需要固定大小的数组或哈希表