华为OD机试题库《C++》限时优惠 9.9
华为OD机试题库《Python》限时优惠 9.9
华为OD机试题库《JavaScript》限时优惠 9.9
针对刷题难,效率慢,我们提供一对一算法辅导, 针对个人情况定制化的提高计划(全称1V1效率更高)。
看不懂有疑问需要答疑辅导欢迎私VX: code5bug
对一个数据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个数据为需要分类的数据。
输出最多数据的有效类型有多少个数据。
输入:
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。
输入:
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。
解题思路
- 输入处理:首先读取输入的12个数据,其中第一个数据是
c
,第二个数据是b
,剩下的10个数据是需要分类的数据。- 字节和计算:对于每个需要分类的数据,计算其四个字节的和。具体来说,将数据的每个字节(8位)提取出来并相加。
- 取模运算:将计算出的字节和对
b
取模,得到的结果即为该数据的类型。- 有效类型判断:如果取模的结果小于
c
,则该数据属于有效类型,否则为无效类型。- 统计有效类型数据:使用哈希表(或字典)统计每种有效类型的数据个数。
- 输出结果:找出统计结果中最大的值,即为有效类型中包含数据最多的类型的数据个数。
时间复杂度
- 字节和计算:对于每个数据,提取四个字节并求和的时间复杂度是O(1),因为有固定的四次操作。
- 分类与统计:遍历10个数据,每个数据的处理时间是O(1),因此总时间复杂度是O(10) = O(1)。
- 总体时间复杂度:O(1),因为数据量固定且很小。
空间复杂度
- 统计哈希表:最坏情况下,有效类型可能有
b
种(但实际最多c
种),因此空间复杂度是O(min(b, c))。由于b
和c
都是输入的小整数,空间复杂度可以视为O(1)。- 总体空间复杂度:O(1)。
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();
})();
希望这个专栏能让您熟练掌握算法, 。
整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。