給定乙個十進位制的正整數number,選擇從裡面去掉一部分數字,希望保留下來的數字組成的正整數最大。
輸入為兩行內容,第一行是正整數number,1 ≤ length(number) ≤ 50000。第二行是希望去掉的數字數量cnt 1 ≤ cnt < length(number)。
輸出保留下來的結果。
輸入325 1
輸出方法1. 因為想要最後剩下的數盡量大,所以貪心地從前往後找到某位數比後一位小就刪掉這個數,但是這樣需要 o(n*m) (n 是總位數,m 是刪除的個數)。我們可以利用乙個棧來達到 o(n)的時間複雜度:遍歷每一位,當還能刪除時且棧內的數比當前數小就出棧,直到棧內的數比當前數大,或者棧空,就將當前的數入棧。如果全部數都入過棧時還需要刪除,那就從棧頂刪。
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:
m -= 1
sta.pop()
print (''.join(sta[:(len(s) - n)]))
方法2. 利用10個佇列記錄0~9出現的位置,例如9843648,那麼4出現的位置就是2,5,8出現的位置就是1,6。然後貪心地從大到小列舉每一位可以放的數字,
#include using namespace std;
queue q[10];
char s[50010];
int n, m, len;
int main()
}putchar(c);
}return 0;
}
2017校招真題 幸運數
時間限制 1秒 空間限制 32768k 題目描述 小明同學學習了不同的進製之後,拿起了一些數字做起了遊戲。小明同學知道,在日常生活中我們最常用的是十進位制數,而在計算機中,二進位制數也很常用。現在對於乙個數字x,小明同學定義出了兩個函式f x 和g x f x 表示把x這個數用十進位制寫出後各個數字...
2017校招真題 酒店價格
題目描述 酒店房間的 錄入是通過時間段來錄入的,比如10月1日至10月7日800元,10月8日至10月20日500元,請實現以下函式int merge int daterangeprices 輸入是某個酒店多個日期段的 每個日期段 終止日期大於等於起始日期 和對應的 使用長度為3的陣列來表示,比如 ...
2017校招真題 騰訊 編碼
假定一種編碼的編碼範圍是a y的25個字母,從1位到4位的編碼,如果我們把該編碼按字典序排序,形成乙個陣列如下 a,aa,aaa,aaaa,aaab,aaac,b,ba,baa,baaa,baab,baac yyyw,yyyx,yyyy 其中a的index為0,aa的index為1,aaa的inde...