题目描述
给定一个整数,给出消除重复数字以后最大的整数
输入描述:
正整数,注意考虑长整数
输出描述
消除重复数字后的最大整数
示例1
输入
423234
输出
432
思路分析 :要保存原来的顺序这个题目才有意思,如果不保存原来的顺序,那直接一个set就搞定了。
很明显这个数字的最大长度不会超过20。怎么暴力都可以了...
思路就是贪心的放每一位ie数字,
比如423234
我们放完第一个4 再放2的时候直接放入,再放3的时候发现前面的2比3小,而且2还有一个剩余,那么我们就用3替换2,一次类推....实现的时候我们可以用栈去搞
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll n, tmp; vector<int> cnt(10); vector<int> s; vector<int> vis(10); cin >> n; tmp = n; while(tmp > 0) { cnt[tmp%10]++; s.push_back(tmp%10); tmp /= 10; } reverse(s.begin(), s.end()); stack<int> st; for (int i = 0; i < s.size(); ++i) { //cout << s[i] << endl; cnt[s[i]]--; if (st.empty()) { st.push(s[i]); vis[s[i]] = 1; } else { while(!st.empty() && st.top() < s[i] && cnt[st.top()] && !vis[s[i]]) { vis[st.top()] = 0; st.pop(); } if (!vis[s[i]]) st.push(s[i]), vis[s[i]] = 1; } } ll ans = 0, T = 1; while (!st.empty()) { ll x = st.top();st.pop(); ans += x*T; T *= 10; } cout << ans << endl; return 0; }
时间: 2024-11-06 13:39:43