给定一个正整数,如果删除其中若干数字,怎么删除能保证剩下的数字组成最大,编程实现,不长于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);
}