数据分类 - 华为OD机试真题(JavaScript 题解)

华为OD机试题库《C++》限时优惠 9.9

华为OD机试题库《Python》限时优惠 9.9

华为OD机试题库《JavaScript》限时优惠 9.9

针对刷题难,效率慢,我们提供一对一算法辅导, 针对个人情况定制化的提高计划(全称1V1效率更高)。

看不懂有疑问需要答疑辅导欢迎私VX: code5bug

华为OD机试真题

题目描述

对一个数据a进行分类,分类方法为:

此数据a(四个字节大小)的四个字节相加对一个给定的值b取模,如果得到的结果小于一个给定的值c,则数据a为有效类型,其类型为取模的值;如果得到的结果大于或者等于c,则数据a为无效类型。

比如一个数据a=0x01010101,b=3,按照分类方法计算(0x01+0x01+0x01+0x01)%3=1,

所以如果c=2,则此a为有效类型,其类型为1,如果c=1,则此a为无效类型;

又比如一个数据a=0x01010103,b=3,按照分类方法计算(0x01+0x01+0x01+0x03)%3=0,

所以如果c=2,则此a为有效类型,其类型为0,如果c=0,则此a为无效类型。

输入12个数据,第一个数据为c,第二个数据为b,剩余10个数据为需要分类的数据,

请找到有效类型中包含数据最多的类型,并输出该类型含有多少个数据。

输入描述

输入12个数据,用空格分隔,第一个数据为c,第二个数据为b,剩余10个数据为需要分类的数据。

输出描述

输出最多数据的有效类型有多少个数据。

示例1

输入:

3 4 256 257 258 259 260 261 262 263 264 265

输出:

3

说明:

10个数据4个字节相加后的结果分别为1 2 3 4 5 6 7 8 9 10,

故对4取模的结果为1 2 3 0 1 2 3 0 1 2,c为3,所以0 1 2都是有效类型,类型为1和2的有3个数据,类型为0的只有2个数据,故输出3。

示例2

输入:

1 4 256 257 258 259 260 261 262 263 264 265

输出:

2

说明:

10个数据4个字节相加后的结果分别为1 2 3 4 5 6 7 8 9 10,

故对4取模的结果为1 2 3 0 1 2 3 0 1 2,c为1,

所以只有0是有效类型,类型为0的有2个数据,故输出2。

题解

解题思路

  1. 输入处理:首先读取输入的12个数据,其中第一个数据是c,第二个数据是b,剩下的10个数据是需要分类的数据。
  2. 字节和计算:对于每个需要分类的数据,计算其四个字节的和。具体来说,将数据的每个字节(8位)提取出来并相加。
  3. 取模运算:将计算出的字节和对b取模,得到的结果即为该数据的类型。
  4. 有效类型判断:如果取模的结果小于c,则该数据属于有效类型,否则为无效类型。
  5. 统计有效类型数据:使用哈希表(或字典)统计每种有效类型的数据个数。
  6. 输出结果:找出统计结果中最大的值,即为有效类型中包含数据最多的类型的数据个数。

时间复杂度

  • 字节和计算:对于每个数据,提取四个字节并求和的时间复杂度是O(1),因为有固定的四次操作。
  • 分类与统计:遍历10个数据,每个数据的处理时间是O(1),因此总时间复杂度是O(10) = O(1)。
  • 总体时间复杂度:O(1),因为数据量固定且很小。

空间复杂度

  • 统计哈希表:最坏情况下,有效类型可能有b种(但实际最多c种),因此空间复杂度是O(min(b, c))。由于bc都是输入的小整数,空间复杂度可以视为O(1)。
  • 总体空间复杂度:O(1)。

JavaScript

const rl = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout,
});
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

// Author: code5bug
(async () => {
    const nums = (await readline()).split(' ').map(Number);

    // 计算数据a的四个字节的和
    const byte_sum = function (a) {
        let sum = 0;
        for (let i = 0; i < 4; i++) {
            sum += a & 0xFF;  // 提取最低8位
            a >>= 8;          // 右移8位,处理下一个字节
        }
        return sum;
    };

    const [c, b] = [nums[0], nums[1]];  // 读取c和b
    const freq = new Map();              // 用于统计每种有效类型的数据个数

    for (let i = 2; i < nums.length; i++) {
        const sum = byte_sum(nums[i]);   // 计算四个字节的和
        const mod = sum % b;            // 对b取模
        if (mod < c) {                  // 判断是否为有效类型
            freq.set(mod, (freq.get(mod) || 0) + 1);  // 更新统计
        }
    }

    // 输出有效类型中数据最多的类型的个数,如果没有有效类型则输出0
    const ans = freq.size > 0 ? Math.max(...freq.values()) : 0;
    console.log(ans);

    rl.close();
})();

希望这个专栏能让您熟练掌握算法, 。

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。

你可能感兴趣的:(华为od,javascript,开发语言,数据结构,算法,机试)