一、题目详情
二、java题解
话不多说先上答案↓
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int[] ls = new int[num];
for (int i = 0; i < ls.length; i++) {
ls[i] = sc.nextInt();
}
Arrays.sort(ls);
HashSet<Integer> set = new HashSet<Integer>();
for (int i = 0; i < ls.length - 1; i++) {
for (int j = i + 1; j < ls.length; j++) {
int ifResult = ls[i] + ls[j];
if (binarySearch(ls, ifResult) != -1) {
set.add(binarySearch(ls, ifResult));
}
}
}
System.out.println(set.size());
}
public static int binarySearch(int[] arr, int dest) {
int begin = 0;
int end = arr.length - 1;
while (begin <= end) {
int mid = (begin + end) / 2;
if (arr[mid] == dest) {
return mid;
} else if (arr[mid] < dest) {
begin = mid + 1;
} else {
end = mid - 1;
}
}
return -1;
}
}
下面我简单解说一下我这些代码的意思
import java.util.Arrays; import java.util.HashSet; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); // 传入一个数字给num也就是后面要输入数字的数量 int[] ls = new int[num]; // 定义一个num数量长度的数组 for (int i = 0; i < ls.length; i++) { ls[i] = sc.nextInt(); // 数组赋值 } Arrays.sort(ls); // Arrays.sort是排序 HashSet<Integer> set = new HashSet<Integer>(); // 定义一个HashSet来去重 for (int i = 0; i < ls.length - 1; i++) { for (int j = i + 1; j < ls.length; j++) { // 这里的循环给举个例子就懂了,比如ls.length=4 // 第一轮的第一次i=0,j=1,第二次i=0,j=2,第三次i=0,j=3 // 第二轮第一次i=1,j=2,第二次i=1,j=3 // 第三轮i=2,j=3 // 就是要整个数组的数字都能配对上一次 int ifResult = ls[i] + ls[j]; // 将配对上的这两个数相加 if (binarySearch(ls, ifResult) != -1) { // binarySearch是二分算法,找到了就返回数字,没找到就返回-1,所以如果不等于-1也就找到了 set.add(binarySearch(ls, ifResult)); // set.add就是添加这个数字的下标也可以ls[binarySearch(ls, ifResult)]来添加值 } } } System.out.println(set.size()); } public static int binarySearch(int[] arr, int dest) { // 二分算法在这里只是略微讲一下,具体的还是看看其他大佬们的讲解,我只是讲一下我对二分算法的一些看法 int begin = 0; int end = arr.length - 1; // 这里的begin是下标0,end是传入的arr数组的长度-1,如果不-1会越界 while (begin <= end) { // 只要begin还小于end这个就会一直循环去找 int mid = (begin + end) / 2; // 取中间数 if (arr[mid] == dest) { // 找到了目标值,然后返回 return mid; } else if (arr[mid] < dest) { // 没找到并且这个值比目标值要小,更改begin的值为这个中间值再+1 begin = mid + 1; } else { // 反之就是比目标值大了,改end的值为这个中间值再-1 end = mid - 1; } } return -1; // 找过了所有数组没找到目标值就说明没有这个值,返回一个-1 } }
三、Python题解
还是直接先上代码
num = eval(input())
ls = []
lss = set()
list = input().split()
for i in range(num):
ls.append(eval(list[i]))
for i in range(num - 1):
for j in range(i + 1, num):
ifResult = ls[i] + ls[j]
if ifResult in ls:
lss.add(ifResult)
print(len(lss))
同样我也简单说明一下这些代码
num = eval(input()) # 第一步依然是传一个num值代表后面会有多少个值传入 ls = [] lss = set() # 定义一个空列表和一个set集合 list = input().split() # 创建一个list列表来获取值并且用split来分割这些字符串 for i in range(num): # 循环num次来给ls列表赋值 ls.append(eval(list[i])) # 这里的eval是去双引号,因为list里面的都是字符串 for i in range(num - 1): for j in range(i + 1, num): # 这里的循环和java的是一样的,稍微说说range函数,range(start,end,step) # 这个range是这么用的,start是初始值,默认是0,end是初始值到这个值-1,也就是不包括end这个值 # step是步数,默认为1,下面举两个例子 # range(5) 取的就是0,1,2,3,4 # range(0,5,2)取的就是0,2,4 ifResult = ls[i] + ls[j] # 同样的相加 if ifResult in ls: lss.add(ifResult) # 如果ifResult在列表ls中就在lss中添加这个值(java就没这么方便了还得去写个二分来找) print(len(lss))
感谢观看,还有不理解的可以来评论区询问我