2017-09-05 39 views
0

面试大公司的问题:你会如何解决?从任意整数中,找到总和为预期总和的对,返回数组结果作为集合

给定一个任意整数的列表,找到总和为未知期望总和的整数对。将数组结果返回到一个集合中。

这是我不得不从开始:

class NumericalEntityProcessor { 

    List<Integer[]> pairsThatSumToX(List<Integer> input, Integer expectedSum) { 

    } 
} 

这些是可能的解决方案2 - 但我错过了一些东西......

class NumericalEntityProcessor { 

    List<Integer[]> pairsThatSumToX(List<Integer> input, Integer expectedSum) { 

    int n = list.size() + 2; 
    int expectedSum = n * (n + 1)/2; 
    int expectedSquaredSum = n * (n + 1) * (2 * n + 1)/6; 
    int sum = 0; 
    int squaredSum = 0; 

    System.out.println("SIZE :::" + list.size()); 

    for (Object num : list) { 
     sum = sum + (int)num; 
     squaredSum = squaredSum + ((int)num * (int)num); 
    } 

    int xplusy = expectedSum - sum; 
    int xsquareplusysquare = expectedSquaredSum - squaredSum; 
    int twoxy = xplusy * xplusy - xsquareplusysquare; 
    int xminusy = (int) Math.sqrt(xsquareplusysquare - twoxy); 
    int x = (xplusy + xminusy)/2; 
    int y = (xplusy - xminusy)/2; 

    return new Integer[] { x, y }; 

    int sum = list.stream().map(Line::getLength).collect(Collectors.summingInt(i->i)); 
    } 
} 

或者,第二attempt-

public class ArrayExample1 { 

    public static void main(String[] args) { 

     int[] number = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

     List<Integer> list = convertIntArrayToList(number); 
     System.out.println("list : " + list); 

    } 

    private static List<Integer> convertIntArrayToList(int[] input) { 

     List<Integer> list = new ArrayList<>(); 
     for (int i : input) { 
      list.add(i); 
     } 
     return list; 
     IntSummaryStatistics stats = list.stream() 
        .collect(Collectors.summarizingInt(Line::getLength)); 
     IntSummaryStatistics stats = list.stream().flatMap(a->Arrays.stream(a)) 
        .collect(Collectors.summarizingInt(i->i)); 
     System.out.println(stats.getSum());  
     } 
    } 
} 

回答

0
  1. 排序清单
  2. 定义两个指针,一个起始于头部和递增,其它起始于尾和递减
  3. 移动的指针,而总引用数字是小于目标
  4. 迭代之后,如果当前的数字总注意目标
  5. 重复步骤3与其它指针
  6. 退出迭代如果总超过目标

由于排序,该算法具有为O(n log n)的时间复杂度。迭代部分是O(n),为了确定整体时间复杂度而忽略它,因为它具有较低的阶数。