面试时,我被要求写以下合同的方法:
boolean checkList(List<Long> list, long sum){...}
例如,它必须返回 true 作为参数:
({1,2,3,4,5,6}
,9
),因为4 + 5 = 9
,并且必须为参数返回 false :
({0,10,30}
,11
),因为不存在2个元素的总和为11的组合
我建议这样的代码:
boolean checkList(List<Long> list, long expectedSum) {
if (list.size() < 2) {
return false;
}
for (int i = 0; i < list.size() - 1; i++) {
for (int k = i; k < list.size(); k++) {
if ((list.get(i) + list.get(k)) == expectedSum) {
return true;
}
}
}
return false;
}
但是面试官要求我再实施一种解决方案。
我无法创建更好的解决方案。你可以吗?
答案 0 :(得分:0)
还可以进行哈希运算。 here中有更多解决方案。
// Java implementation using Hashing
import java.io.*;
import java.util.HashSet;
class PairSum
{
static void printpairs(int arr[],int sum)
{
HashSet<Integer> s = new HashSet<Integer>();
for (int i=0; i<arr.length; ++i)
{
int temp = sum-arr[i];
// checking for condition
if (temp>=0 && s.contains(temp))
{
System.out.println("Pair with given sum " +
sum + " is (" + arr[i] +
", "+temp+")");
}
s.add(arr[i]);
}
}
// Main to test the above function
public static void main (String[] args)
{
int A[] = {1, 4, 45, 6, 10, 8};
int n = 16;
printpairs(A, n);
}
}
答案 1 :(得分:0)
使用java-8的一个班轮:
public boolean checkList(List<Long> list, long expectedSum) {
Set<Long> hashSet = new HashSet<>(list);
return IntStream.range(0, list.size())
.anyMatch(i -> hashSet.contains(expectedSum - list.get(i)));
}
答案 2 :(得分:0)
尝试
public static boolean checklist(List<Long> list, long expectedSum) {
if(list.size() < 2) {
return false;
}
HashSet<Long> hs = new HashSet<Long>();
for(long i : list) {
hs.add(i);
}
for(int i=0; i< list.size(); i++) {
if(hs.contains(expectedSum - list.get(i))) {
return true;
}
}
return false;
}
答案 3 :(得分:-1)
也许查看每个数字,然后查看列表中是否减去该数字的总和
boolean checkList(List<Long> list, long expectedSum) {
if (list.size() < 2) {
return false;
}
for (int i = 0; i < list.size(); i++) {
if(list.contains(expectedSum-list.get(i))){
return true;
}
}
return false;
}