>>> a = [1, 2]
>>> np.asarray(a)
array([1, 2])
考虑具有上述元素的[1, 2, 7, 10, 2, 8]
。我们如何使用Java Collections API和element找到它左边所有元素的总和等于它右边所有元素的总和?
例如,在索引3(即10)的元素的上述ArrayList
中,两个总和是相同的:
ArrayList
答案 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)
我的代码处理这些,但我有两个问题
empty + 0
代码:
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;