繁体   English   中英

如何在整数数组中找到所有对,其和等于给定数字

[英]How to Find all Pairs in an Array of Integers Whose sum is Equal to a Given Number

正在对公司进行选择,但显然我辜负了他。 但是一个我无法解决的单独任务困扰着我。 我想了解我错在哪里以及问题出在哪里。

问题的条件给定一个肯定的 integer“目标”。 还给出了一个正整数序列。 如果序列有两个数,则必须在output文件中写“1”,两个数之和等于“target”的值,如果没有则为“0”。

输入格式

5

1 7 3 4 7 9

Output 格式

1

笔记

问题中使用的所有数字都在 0 < N < 999999999 范围内

输入文件名:input.txt

Output 文件名:output.txt

时间限制 1.5 秒

Memory 限制64MB

我的代码

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;

    public class Sum {

    public static void main(String[] args) throws IOException  {
        Scanner scanner = new Scanner(new File("input.txt"));
        List<Integer> allNumbers = new ArrayList<Integer>();

        while(scanner.hasNext()) {
            allNumbers.add(scanner.nextInt());
        }


        int target = allNumbers.get(0);
        allNumbers.remove(0);

        Integer [] myArray = allNumbers.toArray(new Integer[0]);
        printpairs(myArray, target);

    }

    static void printpairs(Integer arr[], int target) throws IOException { 

        HashSet<Integer> s = new HashSet<Integer>(); 
        FileOutputStream fos = new FileOutputStream("output.txt");
        int temp = 0;
        final int index = arr.length;

        for (int i = 0; i < index; ++i) { 
            temp = target - arr[i]; 

            if (s.contains(temp)) {
                fos.write(Integer.toString(1).getBytes());
                break;
            } 

            s.add(arr[i]); 
        }

        if (!s.contains(temp)) {
            fos.write(Integer.toString(0).getBytes());
        }

    }
}

If I use Java 7x32 I go beyond the time limit, and if I use Java 8 I go beyond the memory limit I also tried to solve through HashSet, but the problem remained the same.

另一个我的变种

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Sum {

    public static void main(String[] args){
        List<Integer> allNumbers = new ArrayList<>();
        try {
            Scanner scanner = new Scanner(new File("input.txt"));

            while (scanner.hasNext()) {
            allNumbers.add(scanner.nextInt());
            }
            scanner.close();
        } catch(FileNotFoundException e) {

        }

        int target = allNumbers.get(0);
        allNumbers.remove(0);

        Integer[] array = allNumbers.toArray(new Integer[0]);

        try {
            printpairs(array, target);
        } catch (Exception e) {

        }
    }

    public static void printpairs(Integer[] numbers, int target) throws Exception {
        FileOutputStream fos = new FileOutputStream("output.txt");

        Arrays.sort(numbers);

        int left = 0;
        int right = numbers.length - 1;
        int sum = 0;

        while (left < right) {
            sum = numbers[left] + numbers[right];

            if (sum == target) {
                fos.write(Integer.toString(1).getBytes());
                fos.close();
                break;
            } else if (sum < target) {
                left = left + 1;

            } else if (sum > target) {
                right = right - 1;
            }
        }

        if (sum != target) {
            fos.write(Integer.toString(0).getBytes());
            fos.close();
        }

    }
}

这是简化此类问题的已知方法:

Set<Integer> sumtoTarget = new HashSet<>();
for (int i = 0; i < n; i++) {
  Integer number = arr[i];

  if (number > target) { continue; }

  Integer diff = target - number;
  if (diff > 0) {
    if (sumToTarget.contains(diff) { 
      // found your pair diff + number
      return 1;
    } else {  // add to the set
      sumToTarget.add(diff); 
    }
  }
}
return 0;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM