删数问题
2016-07-17 00:00
225 查看
题目描述:
键盘输入一个高精度的正整数N(此整数中没有‘0’),去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。 输出应包括所去掉的数字的位置和组成的新的正整数。(N不超过240位)
样例输入
175438
4
样例输出
13
思路:(典型的贪心策略,方法就是从简单入手,慢慢复杂。从n=1开始推导就会发现规律)
现在假设有一个数,124682385,假如n = 1,则结果为12462385。n = 2,结果为1242385。可以知道:最优解是删除出现的第一个左边>右边的数,因为删除之后高位减小,很容易想...那全局最优解也就是这个了,因为删除S个数字就相当于执行了S次删除一个数,因为留下的数总是当前最优解...
代码如下:
键盘输入一个高精度的正整数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()); } }
相关文章推荐
- 添加/删除 windows下Git右键菜单
- 数据库索引
- HTML页面获取URL参数
- Java数据结构(二):线性表之顺序表
- map的三种遍历方法!
- maven的安装
- 数据库连接池的工作原理
- Class.forName的作用
- 简单的java缓存实现
- SmartUpload用法
- Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
- org.apache.log4j.Logger详解
- Java数据结构(四):线性表之双向链表
- Ubuntu 给 rhythmbox 装插件,使其显示歌词功能
- Java数据结构(三):线性表之单链表
- log4j/log4e的使用
- Tomcat设置manager的账户密码
- OC语言键盘处理,collectionView的相互关联,UINavigationView,网页加载
- OC语言中的UINaVigationController和UITabBarController
- 线程 进程 协程