Description
输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,统计这样两个数的对数。
Input
输入第一行为用例个数, 每个测试用例输入第一行是数组,每一个数用空格隔开;第二行是数字和。
Output
输出这样两个数有几对。
示例输入:
1
1 2 4 7 11 0 9 15
11
输出:
3
思路:
1,取得一个数组arr[],和数字sum,定义一个count=0;
2,将arr[]进行排序
3,对每个a[i],然后查找判断sum-a[i]是否也在原始序列中,对于每个a[i],二分查找sum-a[i]是否在原始序列中
4,如果在,count++
5,返回count/2`
import java.util.Scanner;
public class MainSum {
public static int countSum(int[] arr, int sum){
int count=0;
int[] arr1=new int[arr.length];
arr1=bubbleSort(arr);
//在arr1中看是否存在一对数
for (int i = 0; i <arr1.length ; i++) {
int num=sum-arr1[i];
if(binarySearch(arr1,arr1.length,num)==1){
count++;
}
}
count=count/2;
return count;
}
//冒泡排序
public static int[] bubbleSort(int[] arr){
int n=arr.length;
for (int i = 0; i < n; i++) {
for (int j = 0; j <n-1; j++) {
if(arr[j]>arr[j+1]){
int temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
return arr;
}
//查看该元素是否在数组中
static int binarySearch(int[] arr, int len, int a)
{
int low = 0;
int high = len - 1;
int mid = 0;
while(low <= high) {
mid = (low + high)/2;
if(arr[mid] == a)
return 1;
else {
if(arr[mid] < a)
low = mid + 1;
else
high = mid - 1;
}
}
return 0;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String n=sc.nextLine();
int n1=Integer.parseInt(n);
for (int i = 0; i <n1 ; i++) {
//数组用arr1表示
String str=sc.nextLine();
String[] arr=str.split(" ");
int[] arr1=new int[arr.length];
for (int j = 0; j <arr1.length; j++) {
arr1[j]=Integer.parseInt(arr[j]);
}
//表示出sum
String wtr=sc.nextLine();
int sum=Integer.parseInt(wtr);
int count=countSum(arr1,sum);
System.out.println(count);
}
}
}