2018華為筆試題


題目描述

給定一個整數,給出消除重復數字以后最大的整數

輸入描述:

正整數,注意考慮長整數

輸出描述

消除重復數字后的最大整數

示例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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM