【问题标题】:Maximum sum by splitting given string通过拆分给定字符串的最大总和
【发布时间】:2015-06-01 16:33:15
【问题描述】:

给定一个仅由数字组成的字符串 S。我们需要将字符串分成 4 个整数,使它们的总和最大。如何解决?请帮忙

注意:每个整数应≤10^12,且不应包含任何前导零。

每个字符串的大小也可以接近 20。

示例:让 S=52310 则答案为 56,因为 4 个整数是 52,3,1,0。所以最大总和是 56 (52 + 3 + 1 + 0)。

如何有效地做到这一点,因为我不想使用暴力解决方案,因为它的复杂性很高,因为在每个可用的 4 个位置进行拆分将导致非常无效的方法。

【问题讨论】:

  • 也许这篇文章是相关的:open-letter-to-students-with-homework-problems
  • @BrianTompsett 这看起来像家庭作业?我不知道。哪个机构在家作业会出这样的问题
  • 如果每个整数
  • 由于最大字符串长度为13 * 4 = 52,因此蛮力尝试将非常有效。我写了一点效率低下(大量字符串操作)的 Python 脚本,但我仍然很快解决了问题。

标签: algorithm dynamic-programming divide-and-conquer


【解决方案1】:

试试这个,但在 java 中

    private void method()
{
    String value = "52310";
    String sortedString ;
    int stringLength;
    long total = 0; 

    char[] arr = value.toCharArray();
    List<String> seperatedIntegers = new ArrayList<String>();

    if(arr.length > 3)
    {
        sortedString = sort(arr);
        stringLength = sortedString.length();

        for(int m = 0 ; m < 3 ; m ++)
        {
            seperatedIntegers.add(sortedString.substring(stringLength - 1, stringLength));          
            stringLength--;
        }

        seperatedIntegers.add(sortedString.substring(0, stringLength));                 
    }



    if(seperatedIntegers.size() > 0)
    {
        for(int n = 0 ; n < seperatedIntegers.size() ; n ++)
        {
            total = total + Long.valueOf(seperatedIntegers.get(n)); 
        }   
    }

    Toast.makeText(getApplicationContext(), String.valueOf(total), Toast.LENGTH_LONG).show();

}

private String sort(char[] arr)
{
    int temp;
    String val = "";

    List<Integer> sortedValues  = new ArrayList<Integer>();

    for(int i = 0; i < arr.length ; i ++)
    {
        sortedValues.add(Integer.valueOf(String.valueOf(arr[i])));
    }


    for(int j = 1; j < sortedValues.size();  j++)
    {
        for(int k = j; k > 0; k--)
        {
            if(sortedValues.get(k) > sortedValues.get(k-1))
            {
                temp=sortedValues.get(k);
                sortedValues.set(k, sortedValues.get(k-1));
                sortedValues.set(k - 1, temp);
            }
        }
    }

    for(int l = 0; l < sortedValues.size() ; l ++)
    {
        val = val + String.valueOf(sortedValues.get(l));
    }

    return val;     
}

【讨论】:

  • 如果有人对答案投了反对票,请善意地提及原因,这将有助于人们确定所犯的错误是什么。一点都不道德。 Just down 投票意味着,down voter 有助于永远保持错误,而不是解决它。
猜你喜欢
  • 2014-03-02
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
相关资源
最近更新 更多