洛谷:P2141 [NOIP2014 普及组] 珠心算测验的java、Python题解

一、题目详情

二、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))

 感谢观看,还有不理解的可以来评论区询问我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值