华为OD机试真题 JavaScript 实现等和子数组最小和2023 Q1 | 100分

Posted MISAYAONE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为OD机试真题 JavaScript 实现等和子数组最小和2023 Q1 | 100分相关的知识,希望对你有一定的参考价值。

 所有题目均有四种语言实现。C++ 实现目录Python实现目录JavaScript实现目录Java实现目录

题目

给定一个数组nums,将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,组内元素和的最小值

输入描述:
第一行输入 m
接着输入m个数,表示此数组
数据范围:1<=M<=50, 1<=nums[i]<=50

输出描述:

最小拆分数组和。

示例:

输入:

7
4 3 2 3 5 2 1

输出:

5

说明:可以等分的情况有:

4 个子集(5),(1,4),(2,3),(2,3)

2 个子集(5, 1, 4),(2,3, 2,3)

但最小的为5。

 

思路

 1:首先第一个目标,将数组拆分,每个子数组的和相等。

比如[2,2,4] 拆分为[2,2] [4] 

2:其次第二个目标,要求所有的可能拆分条件下,子数组的和最小。

比如 [1,1,1,1] 可以拆分为[1] [1] [1] [1] 和 [1,1]  [1,1] 

明显最小的子数组元素之和是1.

3:和leetcode 698 很像,首先要判定是否能拆分成等和子数组。这里也给出动态规划解法的官方描述:

        用一个整数 S 来表示当前可用的数字集合:从低位到高位,第 i 位为 0 则表示数字 nums[i] 可以使用,否则表示nums[i] 已被使用。然后我们用 dp[S] 来表示在可用的数字状态为 S 的情况下是否可能可行,初始全部状态为记录为不可行状态False,只记  dp[0]=True 为可行状态。同样我们每次对于当前状态下从可用的数字中选择一个数字,若此时选择全部数字取模后小于等于per。则说明选择该数字后的状态再继续往下添加数字是可能能满足题意的,并且此时标记状为可能可行状态,否则就一定不能达到满足。最终dp[U] 即可,其中 U 表示全部数字使用的集合状态。

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博客

不熟悉的可以自行查阅。

这里给出这位博主的总结:

        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(sum / 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 | 100分的主要内容,如果未能解决你的问题,请参考以下文章

100%通过率华为OD机试真题 C 实现等和子数组最小和2023 Q1 | 100分

100%通过率华为OD机试真题 C 实现等和子数组最小和2023 Q1 | 100分

2023 华为OD机试(JavaScript)真题

2023 华为OD机试(JavaScript)真题

华为OD机试真题 2023题库更新中。。。

华为OD机试真题Python实现最多等和不相交连续子序列真题+解题思路+代码(2022&2023)