华为OD机试真题 JavaScript 实现最大平分数组2023 Q1 | 200分
Posted MISAYAONE
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为OD机试真题 JavaScript 实现最大平分数组2023 Q1 | 200分相关的知识,希望对你有一定的参考价值。
所有题目均有四种语言实现。C++ 实现目录、Python实现目录、Java实现目录、JavaScript实现目录
题目
给定一个数组nums,可以将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,最大的平分组个数。
输入描述:
第一行输入 m
接着输入m个数,表示此数组
数据范围:1<=M<=50, 1<=nums[i]<=50输出描述:
最大的平分组数个数。
示例1:
输入:
7
4 3 2 3 5 2 1输出:
4
说明:可以等分的情况有:
4 个子集(5),(1,4),(2,3),(2,3)
2 个子集(5, 1, 4),(2,3, 2,3)
最大的平分组数个数为4个。
示例2:
输入:
7
5 2 1 5 2 1 5 2 1输出:
4
说明:可以等分的情况有:
4 个子集(5,1),(5,1),(5,1),(2,2,2)
2 个子集(5, 1, 5,1),(2,2, 2,5,1)
最大的平分组数个数为4个。
思路
1:这题有点类似22年Q4出过的一道题,等和子数组最小和,与那一题不同的是,本题求解的是平分数组的最小和,这题求解的是最多可以分成多少个平分数组。但是逻辑几乎是一样的,因为!!!最多的分组对应的就是分组最小和!!!!
2:之前那道题是A卷的,这个应该是B卷的,大概就是A卷和B卷之间的差别吧,考点、逻辑几乎不变,就是描述和输出的结果变一下。搞得像高考数学AB卷一样。。。。。
3:它们都衍生于leetcode 698。
4:我这就不献丑了,leetcode各路大佬还是很强的。
JS输入输出
javascript 本身有两种模式:V8 和 Node,两种模式在输入上略有不同。
Node:
let readline = require("readline"); const rl = readline.createInterface( input: process.stdin, output: process.stdout, ); rl.on('line', function(line) // line表示的就是输入的一行 let lines = line.split(' ').map(Number); );
V8:
//假设输入为: 4 5 1 2 // readline() 就表示输入的一行,和python中的 input()函数用法基本一致 let n = readline().split('').map(item=>parseInt(item)); // 4 let k = readline().split(' ').map(item=>parseInt(item)); // 5 let [nums] = readline().split(' ').map(item=>parseInt(item)); // 1 2
具体我也是参考了网上的博主的文章:ACM模式下JavaScript(js)的输入输出 V8 Node_我先润了的博客-CSDN博客
ACM格式javascript 输入输出 - 衣囧~ - 博客园 (cnblogs.com)
不熟悉的可以自行查阅。
这里给出这位博主的总结:
node.js=V8+内置基本模块,相当于java中的JRE=JVM+java标准库
node就是带有能操作IO和网络库的V8引擎,提供了很多可调用的API使得JavaScript能够读写文件,网络请求,系统信息等操作。对V8引擎进行了封装,执行JavaScript的速度更快,性能更好。
Code
//JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。
function canPartitionKSubsets(nums, k)
if(k > nums.length) return false
nums = nums.sort((a,b)=> b - a)
const buckts = new Array(k).fill(0)
const sum = nums.reduce((acc, cur) => acc + cur)
if(sum % k !== 0) return false
const target = sum / k
let fn = (nums, index, buckts, target) =>
if (index === nums.length)
for(let i = 0; i < k; i++)
if(buckts[i] !== target)
return false
return true
for (let i = 0; i < k; i++)
if (buckts[i] + nums[index] > target) continue
buckts[i] += nums[index]
if (fn(nums, index + 1, buckts, target))
return true
buckts[i] -= nums[index]
return false
return fn(nums, 0, buckts, target)
function main(m, nums)
let sum=nums.sort((a, b) => b - a).reduce((p, c) => p + c);
for (let i=m;i>0;i--)
//从最大的可能行开始,满足条件即为为最小的情况
if (canPartitionKSubsets(nums, i))
console.log(i);
break;
main(7, [4, 3, 2, 3, 5, 2, 1])
要求
时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++262144K,其他语言524288K
64bit IO Format:%lld
语言限定:
C(clang11), C++(clang++11), Pascal(fpc 3.0.2), Java(javac 1.8), Python2(2.7.3),
php(7.4.7), C#(mcs5.4), ObjC(gcc 5.4), Pythen3(3.9), JavaScript Node(12.18.2), JavaScript V8(6.0.0),
Sqlite(3.7.9), R(4.0.3), Go(1.14.4), Ruby(2.7.1), Swift(5.3), matlab(Octave 5.2), Pypy2(pypy2.7.13),
Pypy3(pypy3.6.1), Rust(1.44), Scala(2.11.12), Kotlin(1.4.10), Groovy(3.0.6), TypeScript(4.1.2), mysql(8.0)
以上是关于华为OD机试真题 JavaScript 实现最大平分数组2023 Q1 | 200分的主要内容,如果未能解决你的问题,请参考以下文章
华为OD机试真题 JavaScript 实现最大平分数组2023 Q1 | 200分
华为OD机试真题 JavaScript 实现最大化控制资源成本2023 Q1 | 200分
华为OD机试真题 JavaScript 实现最大连续文件之和 /区块链文件转储系统2023 Q1 | 100分
华为OD机试真题 JS 实现最大报酬2023 Q1 | 100分