我正在处理codeeval.com上的问题 - http://codeeval.com/open_challenges/17/。 “编写一个程序来确定列表中连续整数的最大总和”。
输入是一个文本文件,包含逗号分隔的整数列表,每行一个,例如
-10,2,3,-2,0,5,-15
2,3,-2,-1,10
该输入应该为第一行产生8,为第二行产生12。我的答案如下,但我看不出第二行如何获得12,所以我的问题主要是我错过了什么,我是否误解了所要求的内容? (我得到13分答案)
N.B。 - 我住在爱尔兰所以这纯粹是出于我自己的经验,你不会帮我申请工作!另外,我在这里经历了每个类似的问题,但找不到任何相关的问题。
如果我对这个问题的解释不正确,我所需要的只是朝着正确的方向发展,而不是代码。 (如有,有人可以指出第二行如何评估为12而不是13)
import java.util.*;
import java.io.*;
public class largest_sum {
public static void main(String[] args) throws Exception {
FileReader input = new FileReader(args[0]);
BufferedReader bufRead = new BufferedReader(input);
String line;
line = bufRead.readLine();
while(line != null) {
addInts(line);
line = bufRead.readLine();
}
bufRead.close();
System.exit(0);
}
public static void addInts(String line) {
String[] numbers = line.split(",");
Integer largest = Integer.parseInt(numbers[0].trim());
Integer secondLargest = 0;
for(String s : numbers) {
Integer converted = Integer.parseInt(s.trim());
if(converted > largest) {
secondLargest = largest;
largest = converted;
}
}
System.out.println(largest + secondLargest);
}
}
答案 0 :(得分:5)
我建议您查看Kadane's algorithm。
编辑:正如@Paolo和@Vlad指出的那样 - 你没有得到正确的结果,因为你要添加最大的两个数字,而不是寻找一个序列。 Kadane算法通过首先找到数据集中每个位置的最大总和来找到序列的最大总和。
答案 1 :(得分:2)
问题是要求找到连续整数的最大总和。你的程序选择最大和最大的程序并将它们加在一起,而不是相同的东西。
在第一行中,通过采用子序列来实现最大的总和:
2, 3, -2, 0, 5
总和为8(事实上2和-2抵消了实际上最大的+第二大数字是红鲱鱼)。
在第二行中,最大的总和是通过采取整个序列来实现的:
2 + 3 + -2 + -1 + 10
总计为12。
答案 2 :(得分:0)
我已使用以下算法修改了您的代码。基本上如果我理解correctly it is like find valid integer on the right side then move to left side and find valid integer there then get the sum.
public static void main(String[] args) throws Exception {
addInts("-10,2,3,-2,0,5,-15");
addInts("2,3,-2,-1,10");
}
public static void addInts(String line) {
String[] numbers = line.split(",");
// First convert Strings to integer array
int[] ints = new int[numbers.length];
int count = 0;
for (String number : numbers) {
ints[count++] = Integer.parseInt(number);
}
// now find first valid and last valid
int firstValidIndex = -1;
int lastValidIndex = -1;
for (count = 0;;) {
if (ints[count] < 0 && firstValidIndex == -1) {
count++;
continue;
} else {
if (firstValidIndex == -1) {
firstValidIndex = count;
//Swap the loop here now we have to find backwards
count = ints.length - 1;
} else {
if (ints[count] < 0) {
count--;
continue;
} else {
lastValidIndex = count;
break;
}
}
}
}
// Calculate the sum now
int sum = 0;
for (count = firstValidIndex; count <= lastValidIndex; count++) {
sum = sum + ints[count];
}
System.out.println(sum);
}
输出
8
12
答案 3 :(得分:0)
package com.salpe.scjp.algo;
public class Algo1 {
private static int[] test = new int[] { -10, 2, 3, -2, 0, 5, -15 };
public static void main(String[] args) {
int highestSum = test[0];
int higheststart = 0;
int highestend = 0;
for (int i = 0; i < test.length; i++) {
for (int j = 0; j < test.length; j++) {
if (i != j) {
System.out.print("[ " + i + ", " + j );
System.out.print(" = "+findSum(i, j) +"]");
if(highestSum < findSum(i, j)){
highestSum = findSum(i, j);
higheststart = i;
highestend = j;
}
}
}
System.out.println("");
}
System.out.println("Highest Sum " +highestSum);
toString(higheststart, highestend);
}
public static int findSum(int i, int j) {
int sum =0;
for (int j2 = i; j2 <= j; j2++) {
sum = sum +test[j2];
}
return sum;
}
public static int toString(int i, int j) {
int sum =0;
for (int j2 = i; j2 <= j; j2++) {
System.out.print(" ,"+test[j2]);
}
return sum;
}
}
----------
[ 0, 1 = -8][ 0, 2 = -5][ 0, 3 = -7][ 0, 4 = -7][ 0, 5 = -2][ 0, 6 = -17]
[ 1, 0 = 0][ 1, 2 = 5][ 1, 3 = 3][ 1, 4 = 3][ 1, 5 = 8][ 1, 6 = -7]
[ 2, 0 = 0][ 2, 1 = 0][ 2, 3 = 1][ 2, 4 = 1][ 2, 5 = 6][ 2, 6 = -9]
[ 3, 0 = 0][ 3, 1 = 0][ 3, 2 = 0][ 3, 4 = -2][ 3, 5 = 3][ 3, 6 = -12]
[ 4, 0 = 0][ 4, 1 = 0][ 4, 2 = 0][ 4, 3 = 0][ 4, 5 = 5][ 4, 6 = -10]
[ 5, 0 = 0][ 5, 1 = 0][ 5, 2 = 0][ 5, 3 = 0][ 5, 4 = 0][ 5, 6 = -10]
[ 6, 0 = 0][ 6, 1 = 0][ 6, 2 = 0][ 6, 3 = 0][ 6, 4 = 0][ 6, 5 = 0]
Highest Sum 8
,2 ,3 ,-2 ,0 ,5