news 2026/3/23 22:04:15

(新卷,100分)- 最大花费金额(Java JS Python C)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(新卷,100分)- 最大花费金额(Java JS Python C)

(新卷,100分)- 最大花费金额(Java & JS & Python & C)

题目描述

双十一众多商品进行打折销售,小明想购买自己心仪的一些物品,但由于受购买资金限制,所以他决定从众多心仪商品中购买三件,而且想尽可能的花完资金。

现在请你设计一个程序帮助小明计算尽可能花费的最大资金数额。

输入描述
  • 输入第一行为一维整型数组M,数组长度小于100,数组元素记录单个商品的价格,单个商品价格小于1000。
  • 输入第二行为购买资金的额度R,R小于100000。
  • 输入格式是正确的,无需考虑格式错误的情况。
输出描述
  • 输出为满足上述条件的最大花费额度。
  • 如果不存在满足上述条件的商品,请返回-1。
用例
输入

23,26,36,27


78

输出76
说明金额23、26和27相加得到76,而且最接近且小于输入金额78。
输入23,30,40
26
输出-1
说明因为输入的商品,无法组合出来满足三件之和小于26.故返回-1。
题目解析

本题其实就是让我们从n个数中选择3个,保证这个3个数之和最接近且小于等于某个target。

解题思路是:

首先,我们将n个数的数组进行升序。

然后用三个指针I,L,R去指向数组的三个元素,形成三数组合,其中:

  • I指针就是按照for循环遍历的顺序进行移动,从0~n-1
  • L指针初始为 I + 1 位置
  • R指针初始为 n - 1 位置

如下图所示:

其中 I 指针在每一轮循环中是位置固定的,我们需要移动L,R来找不大于,且最接近target的组合。L,R指针的移动逻辑如下:

假设 sum = arr[I] + arr[L] + arr[R]

  • 如果sum == target了,则说明当前三个指针指向的元素组合就是不大于,且最接近target的答案,可以直接返回。
  • 如果 sum < target,则说明三指针指向元素组合之和是一个可能解,但是不一定是最优解,此时我们应该先记录这个可能解,然后尝试将L++,由于arr已经升序了,因此L++后,新的三数组合之和一定比现在的大。
  • 如果 sum > target,则说明三指针指向元素组合之和过大了,此时应该R--,这样新的三数组合之和一定比现在的小。

按此逻辑,将当前 I 指针固定的数的三数组合情况全部求出。

之后,再 I ++ ,尝试其他三数组合。

JavaScript算法源码
/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines = []; rl.on("line", (line) => { lines.push(line); if (lines.length === 2) { const arrM = lines[0].split(",").map(Number); const r = lines[1] - 0; console.log(getResult(arrM, r)); lines.length = 0; } }); function getResult(arr, target) { // 题目说小明要购买三件,如果商品不足三件直接返回-1 if (arr.length < 3) return -1; // 数组升序 arr.sort((a, b) => a - b); let ans = -1; for (let i = 0; i < arr.length; i++) { let l = i + 1; let r = arr.length - 1; while (l < r) { const sum = arr[i] + arr[l] + arr[r]; if (sum == target) { return sum; } else if (sum < target) { ans = Math.max(ans, sum); l++; } else { r--; } } } return ans; }
Java算法源码
import java.util.Arrays; import java.util.Scanner; public class Main { // 输入获取 public static void main(String[] args) { Scanner sc = new Scanner(System.in); Integer[] arrM = Arrays.stream(sc.nextLine().split(",")).map(Integer::parseInt).toArray(Integer[]::new); int r = Integer.parseInt(sc.nextLine()); System.out.println(getResult(arrM, r)); } // 算法入口 public static int getResult(Integer[] arr, int target) { // 题目说小明要购买三件,如果商品不足三件直接返回-1 if (arr.length < 3) return -1; // 数组升序 Arrays.sort(arr); int ans = -1; for (int i = 0; i < arr.length; i++) { int l = i + 1; int r = arr.length - 1; while (l < r) { int sum = arr[i] + arr[l] + arr[r]; if (sum == target) { return sum; } else if (sum < target) { ans = Math.max(ans, sum); l++; } else { r--; } } } return ans; } }
Python算法源码
# 输入获取 arr = list(map(int, input().split(","))) target = int(input()) # 算法入口 def getResult(): # 题目说小明要购买三件,如果商品不足三件直接返回-1 if len(arr) < 3: return -1 # 数组升序 arr.sort() ans = -1 for i in range(len(arr)): l = i + 1 r = len(arr) - 1 while l < r: total = arr[i] + arr[l] + arr[r] if total == target: return total elif total < target: ans = max(ans, total) l += 1 else: r -= 1 return ans # 算法调用 print(getResult())
C算法源码
#include <stdio.h> #include <stdlib.h> #define MAX(a,b) (a) > (b) ? (a) : (b) #define MAX_SIZE 100 int cmp(const void *a, const void *b); int getResult(int nums[], int nums_size, int target); int main() { int nums[MAX_SIZE]; int nums_size = 0; while (scanf("%d", &nums[nums_size++])) { if (getchar() != ',') break; } int target; scanf("%d", &target); printf("%d\n", getResult(nums, nums_size, target)); return 0; } int getResult(int nums[], int nums_size, int target) { // 题目说小明要购买三件,如果商品不足三件直接返回-1 if (nums_size < 3) return -1; // 数组升序 qsort(nums, nums_size, sizeof(int), cmp); int ans = -1; for(int i=0; i<nums_size; i++) { int l = i + 1; int r = nums_size - 1; while(l < r) { int sum = nums[i] + nums[l] + nums[r]; if(sum == target) { return sum; } else if(sum < target) { ans = MAX(ans, sum); l++; } else { r--; } } } return ans; } int cmp(const void *a, const void *b) { return (*(int *) a) - (*(int *) b); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/21 2:37:58

Java开发者必看:Seed-Coder-8B-Base如何优化日常编码?

Java开发者必看&#xff1a;Seed-Coder-8B-Base如何优化日常编码&#xff1f; 在现代Java开发中&#xff0c;面对Spring生态的复杂配置、庞大的类库体系以及严格的代码规范&#xff0c;开发者常常陷入重复编码与调试陷阱。即便经验丰富的工程师&#xff0c;也难以避免手写gette…

作者头像 李华
网站建设 2026/3/12 16:32:18

不被任何人拿捏的妙招:跳针沟通法

“最完美的胜利&#xff0c;就是别人从你这儿得不到任何回应。” 我在聚餐时见过一个特别牛的人。 有个人在那儿特别低情商&#xff0c;一个劲评价他的穿着&#xff1a;"你看你穿的衣服&#xff0c;衣服裤子款式都很好&#xff0c;但搭配起来很难看……" 那个人听…

作者头像 李华
网站建设 2026/3/23 18:56:02

DiskInfo下载官网数据辅助分析Wan2.2-T2V-5B磁盘IO性能瓶颈

DiskInfo 数据辅助分析 Wan2.2-T2V-5B 磁盘 IO 性能瓶颈 在短视频生成、实时内容创作等场景中&#xff0c;AI模型的“响应速度”直接决定用户体验。Wan2.2-T2V-5B 作为一款参数量约50亿的轻量化文本到视频&#xff08;Text-to-Video, T2V&#xff09;模型&#xff0c;凭借其秒级…

作者头像 李华
网站建设 2026/3/18 15:31:26

gpt-oss-20b与Codex对比:谁更适合代码生成任务?

gpt-oss-20b 与 Codex 对比&#xff1a;谁更适合代码生成任务&#xff1f; 在今天的软件开发环境中&#xff0c;AI 驱动的编程辅助已不再是未来构想&#xff0c;而是每天都在发生的现实。从自动补全到整函数生成&#xff0c;大语言模型&#xff08;LLM&#xff09;正深度介入开…

作者头像 李华
网站建设 2026/3/20 11:19:30

Dify外部API连接Qwen-Image-Edit-2509与其他SaaS工具

Dify 外部 API 连接 Qwen-Image-Edit-2509 与其他 SaaS 工具 在电商运营的日常中&#xff0c;一个常见的场景是&#xff1a;市场团队需要为即将到来的冬季促销活动&#xff0c;将上百款产品的模特图背景统一更换为雪景&#xff0c;并把夹克换成羽绒服。过去&#xff0c;这项任务…

作者头像 李华
网站建设 2026/3/20 7:54:16

Layui-Vue:构建企业级应用的终极Vue组件解决方案

Layui-Vue是一个基于Vue 3.0构建的企业级UI组件库&#xff0c;继承了Layui经典的设计理念&#xff0c;为开发者提供80开箱即用的高质量组件&#xff0c;覆盖后台管理系统全流程需求。通过精心设计的API接口和直观的使用方式&#xff0c;Layui-Vue让企业应用开发变得简单高效&am…

作者头像 李华