如何确定清单2中是否有提供总和的元素?

时间:2018-10-16 16:47:54

标签: java algorithm list search

面试时,我被要求写以下合同的方法:

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;
}

但是面试官要求我再实施一种解决方案。

我无法创建更好的解决方案。你可以吗?

4 个答案:

答案 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;
}