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

求最大值,菜鸟,求教
有个字符串数组,字符串内只有数字和“.”,比如String[] str={".15", "7..", "402", "..3"},代表有4个字符串,每个元素长度都为 3,现在将数组里面元素进行随机组合成字符串(打乱顺序),
比如将元素按"..3.154027.."的顺序相连。然后截取其中连续的片段"154027"。连续的数字的总和为1+5+4+0+2+7=19。这个19是所有组合里面得到的最大的值。Java怎么实现啊。

------解决方案--------------------
探讨

引用:

引用:

引用:

Java code

public static void main(String[] args) {
String[] strs = { ".15", "7..", "402", "..3" };// 字符串数组,你可以随意组合
String str = ""; // 把上面的数组拼成……

------解决方案--------------------
Java code

import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
    public static String[] random(String[] strs){
        int index = 0;
        for(int i = 0;i<strs.length;i++){
            index =Math.abs(new Random().nextInt()%strs.length);
            String temp = strs[i];
            strs[i] = strs[index];
            strs[index] = temp;
        }
        return strs;
    }
    public static void main(String[] args) {
        String[] str={".15", "7..", "402", "..3",".6.","9.8"};
        Test.random(str);
        StringBuffer sb = new StringBuffer();
        for(String s:str){
            sb.append(s);
        }
        String temp = sb.toString();
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher(temp);
        int sum = 0;
        int Maxsum = 0;
        String maxSumStr ="";
        System.out.println(sb);
        while(m.find()){
            String s = m.group(0);
            for(int i=0;i<s.length();i++){
                sum+=Integer.parseInt(String.valueOf((s.charAt(i))));
            }
            if(sum > Maxsum){
                Maxsum = sum;
                maxSumStr = s;
                sum = 0;
            }
            else{
                sum=0;//刚才漏掉这句。
            }
        }
        System.out.println("最大值:"+Maxsum);
        System.out.println("最大子串"+maxSumStr);
    }
}

------解决方案--------------------
讨论了这么久,其实题目本质上是个排列组合求最大值的问题,跟随机没啥关系。

但我认为,就这个题目而言,根本无需这么复杂的去组合它,从需求而言,其实可以考虑一次循环就搞定了。

这个题目中的最大数实际上基本是 ..xxx + yyy + zzz.. 这种组合方式,计算最大值的时候也是按照单个数字相加的最大值,所以也不需要去考虑拼接方式差异所导致数值大小不一样。

所以在一次循环之内,得到最大的 yyy,xxx,zzz,循环结束后,3个值相加,这题目也就算结束了。