題目描述
給定一個整數,給出消除重復數字以后最大的整數
輸入描述:
正整數,注意考慮長整數
輸出描述
消除重復數字后的最大整數
示例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]++; // cnt[i] 記錄i出現過幾次 s.push_back(tmp%10); //s用來存n的每一位 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]]--; //用完s[i]那么s[i]的個數-- if (st.empty()) { st.push(s[i]); vis[s[i]] = 1; //s[i]進棧 } 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; }