查找一个索引,其中左侧和右侧的所有元素的总和在ArrayList中相等

时间:2017-02-24 14:38:42

标签: java arraylist

>>> a = [1, 2]
>>> np.asarray(a)
array([1, 2])

考虑具有上述元素的[1, 2, 7, 10, 2, 8] 。我们如何使用Java Collections API和element找到它左边所有元素的总和等于它右边所有元素的总和?

例如,在索引3(即10)的元素的上述ArrayList中,两个总和是相同的:

ArrayList

3 个答案:

答案 0 :(得分:1)

在Patrick Parker的一些反馈(见评论)和EatSleepCodeRepeat对Viktor Mellgren的问题的反馈后,我认为以下代码是一个合适的Java 8前解决方案,以获得所有索引,左边所有元素的总和等于所有索引的总和元素在右边。

使用 O(n)时间查找所有索引,而不是使用 O(n²)作为Viktor的代码,但这是以一些初始化开销为代价的。他所描述的边缘案件处理得当。

public static List<Integer> indexesWithLeftRightSumsEqual(List<Integer> values) {
    List<Integer> indexes = new ArrayList<Integer>();
    List<Integer> cumulated = new ArrayList<Integer>(values.size() + 1);
    cumulated.add(0);
    for (int i = 0; i < values.size(); i++) {
        cumulated.add(cumulated.get(i) + values.get(i));
    }
    int totalSum = cumulated.get(values.size());
    for (int i = 0; i < values.size(); i++) {
        if ((cumulated.get(i) * 2) == (totalSum - values.get(i))) {
            indexes.add(i);
        }
    }
    return indexes;
}

以下是我以前的解决方案,在帕特里克澄清之后应该被认为是黑客...

此代码首先计算总和,然后计算每个元素的左和,直到(总和 - 左和 - 元素本身),实际上是右和,等于左和。

List<Integer> list = Arrays.asList(1, 2, 7, 10, 2, 8);
int sum = list.stream().mapToInt(Integer::intValue).sum();
IntStream.range(0, list.size()).reduce(0, (leftSum, i) -> {
    Integer element = list.get(i);
    if (leftSum == sum - leftSum - element) {
        System.out.println("Element " + element + " at index " + i);
    }
    return leftSum + element;
});

请注意,List中的索引为零,因此index = 3在这里是正确的。

答案 1 :(得分:0)

如果你有java8和List:

<?php
$fileName = $_FILES["upload"]["name"]; 
$fileTmpLoc = $_FILES["upload"]["tmp_name"]; 
$fileType = $_FILES["upload"]["type"];
$fileSize = $_FILES["upload"]["size"]; 
$fileErrorMsg = $_FILES["upload"]["error"];

if (!$fileTmpLoc) { // if file not chosen
echo "ERROR: Please browse for a file before clicking the upload button.";
exit();
}
if(move_uploaded_file($fileTmpLoc, "upload/$fileName")){
echo "$fileName upload is complete";

} else {
echo "move_uploaded_file function failed";
}

?>

答案 2 :(得分:-1)

我的代码处理这些,但我有两个问题

  • 如何处理空列表,总和被认为是0或不是 是否可以接受?
    • (0,1,-1)是索引0为empty + 0
    • 的情况
  • 您想要第一个索引还是所有可能的索引?
    • (1,-1,1,-1,1)是这样一种情况,无论你选哪里,总和都是相同的

代码:

public static void main(String[] args) {
    List<Integer> ints = Arrays.asList(1, 2, 7, 10, 2, 8);
    // List<Integer> ints = Arrays.asList(1, -1, 1, -1, 1, -1, 1, -1, 1);
    // List<Integer> ints = Arrays.asList(0, 1, -1);

    printEqualAtIndexes(ints);

}

private static void printEqualAtIndexes(List<Integer> ints) {
    for (int i = 0; i < ints.size(); i++) {
        boolean lrsumsEqual = lrsumsEqual(ints, i);
        if (lrsumsEqual) {
            System.out.println("Equal at index " + i + ", that is element " + ints.get(i));
        }
    }
}

private static boolean lrsumsEqual(List<Integer> ints, int index) {

    int left = ints.stream().limit(index).mapToInt(Integer::intValue).sum();
    int right = ints.stream().skip(index + 1).mapToInt(Integer::intValue).sum();

    return left == right;
}

如果你不能使用java 8,那么将lrsumsEqual更改为:

private static boolean lrsumsEqual(List<Integer> ints, int index) {
    int left = 0;
    List<Integer> llist = ints.subList(0, index);

    for (int i : llist) {
        left = left + i;
    }

    int right = 0;
    List<Integer> rlist = ints.subList(index + 1, ints.size());

    for (int i : rlist) {
        right = right + i;
    }

    // int left = ints.stream().limit(index).mapToInt(Integer::intValue).sum();
    // int right = ints.stream().skip(index + 1).mapToInt(Integer::intValue).sum();

    return left == right;