删数问题

来源:互联网 发布:java ee 新闻策划案例 编辑:程序博客网 时间:2024/06/10 13:02

题目描述:
  键盘输入一个高精度的正整数N(此整数中没有‘0’),去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。 输出应包括所去掉的数字的位置和组成的新的正整数。(N不超过240位) 

样例输入
175438 


样例输出
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());}}


0 0
原创粉丝点击