返回目录

题目描述

给定一个数组,编写一个函数来计算它的最大N个数与最小N个数的和。你需要对数组进行去重。

说明:

  • 数组中数字范围[0, 1000]
  • 最大N个数与最小N个数不能有重叠,如有重叠,输入非法返回-1
  • 输入非法返回-1

输入描述

  • 第一行输入M, M标识数组大小
  • 第二行输入M个数,标识数组内容
  • 第三行输入N,N表达需要计算的最大、最小N个数

输出描述

输出最大N个数与最小N个数的和

示例:

输入5
95 88 83 64 100
2
输出342
说明最大2个数[100,95],最小2个数[83,64], 输出为342。

题目解析

简单的逻辑题。主要应该是考察数组常用方法的使用,以及数组去重如何实现。

Python算法源码

def get_result(arr, n):
    if n <= 0:
        return -1
  
    s = set()
  
    for val in arr:
        if val < 0 or val > 1000:
            return -1
        s.add(val)
  
    if len(s) < n * 2:
        return -1
  
    arr = sorted(s)
  
    l, r = 0, len(arr) - 1
    ans = 0
  
    while n > 0:
        ans += arr[l] + arr[r]
        l += 1
        r -= 1
        n -= 1
  
    return ans

if __name__ == "__main__":
    m = int(input())  # 读取m的值
    arr = list(map(int, input().split()))  # 读取数组arr
    n = int(input())  # 读取n的值
  
    print(get_result(arr, n))  # 打印结果

C算法源码

#include <stdio.h>
#include <stdlib.h>

// 获取结果
int get_result(int arr[], int m, int n) {
    if (n <= 0) return -1;

    int s[1001] = {0}; // 假设值的范围是从0到1000

    for (int i = 0; i < m; i++) {
        if (arr[i] < 0 || arr[i] > 1000) return -1; // 检查值是否在范围内
        s[arr[i]] = 1; // 将值添加到集合中
    }

    int count = 0;
    for (int i = 0; i <= 1000; i++) {
        if (s[i]) count++; // 统计集合中不重复的值的数量
    }

    if (count < n * 2) return -1; // 检查是否有足够的不重复值

    int distinct_arr[1001], index = 0;
    for (int i = 0; i <= 1000; i++) {
        if (s[i]) distinct_arr[index++] = i; // 将不重复的值添加到数组中
    }

    int l = 0, r = count - 1;
    int ans = 0;

    while (n > 0) {
        ans += distinct_arr[l] + distinct_arr[r]; // 计算总和
        l++;
        r--;
        n--;
    }

    return ans; // 返回结果
}

int main() {
    int m, n;
    scanf("%d", &m); // 读取m的值

    int *arr = (int *)malloc(m * sizeof(int));
    for (int i = 0; i < m; i++) {
        scanf("%d", &arr[i]); // 读取数组arr
    }

    scanf("%d", &n); // 读取n的值

    printf("%d\n", get_result(arr, m, n)); // 打印结果

    free(arr); // 释放分配的内存

    return 0;
}

Java算法源码

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;

public class Main {
    // 获取结果
    public static int getResult(int[] arr, int n) {
        if (n <= 0) return -1;

        int[] s = new int[1001]; // 假设值的范围是从0到1000

        for (int val : arr) {
            if (val < 0 || val > 1000) return -1; // 检查值是否在范围内
            s[val] = 1; // 将值添加到集合中
        }

        int count = 0;
        for (int i = 0; i <= 1000; i++) {
            if (s[i] != 0) count++; // 统计集合中不重复的值的数量
        }

        if (count < n * 2) return -1; // 检查是否有足够的不重复值

        int[] distinctArr = new int[1001];
        int index = 0;
        for (int i = 0; i <= 1000; i++) {
            if (s[i] != 0) distinctArr[index++] = i; // 将不重复的值添加到数组中
        }

        int l = 0, r = count - 1;
        int ans = 0;

        while (n > 0) {
            ans += distinctArr[l] + distinctArr[r]; // 计算总和
            l++;
            r--;
            n--;
        }

        return ans; // 返回结果
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int m = sc.nextInt(); // 读取m的值

        int[] arr = new int[m];
        for (int i = 0; i < m; i++) {
            arr[i] = sc.nextInt(); // 读取数组arr
        }

        int n = sc.nextInt(); // 读取n的值

        System.out.println(getResult(arr, n)); // 打印结果
    }
}
最后修改:2024 年 04 月 04 日
如果觉得我的文章对你有用,请随意赞赏