給定一個正整數,如果刪除其中若干數字,怎麼刪除能保證剩下的數字組成最大,編程實現,不長於O(n),輸入給定的正整數和要刪除的數字個數
5349 2 ==》 59
思路:
先求這個數字的遞減序列,然後刪除遞減序列的最後一個數,最後如果要求刪除的個數還多了就刪除當前刪除之後序列從後開始刪。這裏我用棧來處理,原來數組中只要當前位比前一位要大就說明前面是遞減序列最後一個,再判斷是否滿足已經刪除的個數小於要刪除的個數,滿足就出棧。遍歷後如果發現還不夠刪就開始進行出棧操作,從最後一位往前刪。代碼如下:
public static int GetMax(int num,int m) {
if (num == 0) return 0;
string str = num.ToString();
Stack<char> values = new Stack<char>();
values.Push(str[0]);
int count = 0;
//當前位大於上一位則上一位就是遞減序列的最後一個.
for (int i = 1; i < str.Length; i++) {
if (str[i] > str[i - 1] && count < m) {
values.Pop();
count++;
}
values.Push(str[i]);
}
//判斷是否刪完, n > 0 就從最後一位開始往前刪
int n = m - count;
for (int i = 0; i < n; i++) {
values.Pop();
}
//下面就是將棧裏面數據取出轉成數字
string s = "";
char[] cs = values.ToArray();
for (int i = 0; i < cs.Length; i++) {
s = cs[i] + s;
}
return int.Parse(s);
}