【nowcoder-2017校招真題】保留最大的數

牛客在線編程-保留最大的數html

題目描述

給定一個十進制的正整數number,選擇從裏面去掉一部分數字,但願保留下來的數字組成的正整數最大。python

輸入描述:

輸入爲兩行內容,第一行是正整數number,1 ≤ length(number) ≤ 50000。第二行是但願去掉的數字數量cnt 1 ≤ cnt < length(number)。c++

輸出描述:

輸出保留下來的結果。編程

示例1

輸入

325 1app

輸出

35spa

題解

方法1. 由於想要最後剩下的數儘可能大,因此貪心地從前日後找到某位數比後一位小就刪掉這個數,可是這樣須要 O(n*m) (n 是總位數,m 是刪除的個數)。咱們能夠利用一個棧來達到 O(n)的時間複雜度:遍歷每一位,當還能刪除時且棧內的數比當前數小就出棧,直到棧內的數比當前數大,或者棧空,就將當前的數入棧。若是所有數都入過棧時還須要刪除,那就從棧頂刪。code

sta = []
#num = '0123456789'

s = input()
n = m = int(input())

for i in s:
    #while len(sta) != 0 and num.index(sta[-1]) < num.index(i) and m > 0:
    while len(sta) != 0 and sta[-1] < i and m > 0:
        m -= 1
        sta.pop()
    sta.append(i)
    
print (''.join(sta[:(len(s) - n)]))

方法2.htm

貪心的從頭開始日後面查找前一個數比後一個數小的相鄰兩數,刪除前面的數,當全部這種狀況都刪除,數字數量cnt還不爲0,從後面刪除剩餘cnt個數的數。blog

(若是選擇刪除所有0,再刪除所有1,再刪除所有2的方法,這種貪心策略是錯誤的。例如:3450  1,正確結果應該爲450)get

#include<bits/stdc++.h>

using namespace std;

const int maxn = 50005;

char s[maxn];

int stk[maxn];

 

int main(){

    int cnt,top = -1;

    scanf("%s %d",s,&cnt);

    int len = strlen(s);

    for (int i = 0;i < len - 1;i++){

        if (s[i] >= s[i + 1] || !cnt){

            stk[++top] = s[i] - '0';

        }else if (cnt && s[i] < s[i + 1]){

            cnt--;

            while (cnt && top >= 0 && stk[top] < s[i + 1] - '0'){

                top--;

                cnt--;

            }

        }

    }

    stk[++top] = s[len - 1] - '0';

    while (cnt){

        cnt--;

        top--;

    }

    for (int i = 0;i <= top;i++){

        printf("%d",stk[i]);

    }

    printf("\n");

    return 0;

}

//https://www.cnblogs.com/zzy19961112/p/8525873.html
相關文章
相關標籤/搜索