题目描述:
键盘输入一个高精度的正整数N(此整数中没有‘0’),去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。 输出应包括所去掉的数字的位置和组成的新的正整数。(N不超过240位)
样例输入
175438
4
样例输出
13
思路:(典型的贪心策略,方法就是从简单入手,慢慢复杂。从n=1开始推导就会发现规律)
现在假设有一个数,124682385,假如n = 1,则结果为12462385。n = 2,结果为1242385。可以知道:最优解是删除出现的第一个左边>右边的数,因为删除之后高位减小,很容易想...那全局最优解也就是这个了,因为删除S个数字就相当于执行了S次删除一个数,因为留下的数总是当前最优解...
代码如下:
/** * 删数问题 * @author mastery * */ public class NumberDelete { // 需要删除的数 private String number; // 需要删除的数字个数 private int deleteSeveral; public NumberDelete(String number, int deleteSeveral) { this.number = number; this.deleteSeveral = deleteSeveral; } public NumberDelete() { super(); } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public int getDeleteSeveral() { return deleteSeveral; } public void setDeleteSeveral(int deleteSeveral) { this.deleteSeveral = deleteSeveral; } private String delete() { char[] arrayChar = number.toCharArray(); int index = 0 , count = 0; int len = arrayChar.length; while(index < len - 1) { if(arrayChar[index] > arrayChar[index+1]) { CharUtil.deleteChar(arrayChar, index); index = -1; len--; // 记录删除的次数 count++; } if(count == deleteSeveral) { break; } index ++; } return String.valueOf(arrayChar); } public String deleteResult() { String deleteNumber = delete(); return deleteNumber.substring(0 , deleteNumber.length() - deleteSeveral); } private static class CharUtil { public static void deleteChar(char[] arrayChar , int index) { for(int i = index ; i < arrayChar.length - 1 ; i++) { arrayChar[i] = arrayChar[i + 1]; } } } public static void main(String[] args) { NumberDelete nd = new NumberDelete("178543" , 4); System.out.println(nd.deleteResult()); } }
原文:http://blog.csdn.net/u011990285/article/details/42675843