日期:2014-05-20  浏览次数:20682 次

Q求用JAVA 做删数问题
急求用eclipse做的删数问题  键盘输入一个高精度的正整数n(n<10位),去掉任意s个数字后剩下的数字按原左右次序组成一个新的正整数,寻求一种方案,使得新的正整数最小。
问题分析
1) 贪心法求解:删k个数符的全局最优解,包含了删除1个数符的子问题的最优解。
2) 以字符串形式输入s,使用尽可能逼近目标的贪心法来逐一删去其中的k个数符,每一步总是选择一个能使剩下的数最小的数符删去
有界面最好   
求高手啊 ,,,老师说这个不难 可是我就是个菜鸟啊  网上搜的都是用C做的
删数问题???

------解决方案--------------------
你举得例子要比这样单纯的说介绍的更清楚。
我想问一下,比如
4321234这个数
删除212这三个数
那么如果按照原有的左右顺序就是4334
如果按照最小的原则就是3344
这两者好像矛盾啊

------解决方案--------------------
虽然不喜欢那些张口就要代码的问题,但是,节假日还要上班的人蛋疼的还是写了一遍。


package com.test;

public class MinInt {


/**
 * 输入一个高精度的正整数n(n<10位),去掉任意s个数字后剩下的数字按原左右次序组成一个新的正整数,
 * 寻求一种方案,使得新的正整数最小。
 * number: 输入的正整数
 * n:要去掉的数字个数
 */
public static int findMinNumber(Integer number,int n)
{
String result = "";
String numberStr = number+"";
int length = numberStr.length();
if(length<=n)
{
return number;
}

//循环length-n次,每一次找出一个数字
boolean isFirstNumber = true;
for(int i=0;i<length-n;i++)
{
int[] array = findMinDigit(numberStr,length-n-i-1,isFirstNumber);

result+=array[0];
numberStr = numberStr.substring(array[1]+1);
isFirstNumber = false;
}

return Integer.parseInt(result);
}

/**
 * 
 * @param number 输入的正整数,字符串形式
 *    remind 后面要包含几个数字
 *    isFirstNumber 是否是第一个数字
 * @return 返回这个字符串中最小的数字,这个数字后面一定要有remind个数
 * 
 */
public static int[] findMinDigit(String number,int remind,boolean isFirstNumber)
{

int length = number.length();
int min = number.charAt(0)-'0'; 
int position = 0;

for(int i=1;i<length-remind;i++)
{
int t = number.charAt(i)-'0';
//第一个数字不能是0
if(t == 0 && isFirstNumber)
{
continue;
}
if(t<min)
{
min = t;
position = i;
}
}

return new int[]{min,position};
}


/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("result="+findMinNumber(403145983, 6));
}

}



界面什么的可以用Swing,装个插件windowsbuilder。

加油吧学弟,只能帮你到这了。
------解决方案--------------------
大致了解了下题意,不知道是不是这样:
例如:98658,要删除2位,你想,5位数,删2位还剩3位,那么,6之前的比6大的数都要删除,恰好得658。再举一例,91658,6之前比6小的数不能删了,只能删9,6得158。再举一例,90658,能删9和6吗?不能,删了得058,是个两位数(也许parseInt后会成8进制的数,出问题),只能从0之前选取2个比6大的数,但不能是前导0(或者刚好可以吧0之前包括0全删),不足的从6以后选取,这里删9,0,的658.再举一例:98058,就这样了,和前例一样,删第一个9和最后8,得805.中心意思就这样,不知你体会了没有。
------解决方案--------------------
大神们不要害人,应该说思路,而不是直接帮别人写好,这样楼主很难学到知识的!!