共计 1207 个字符,预计需要花费 4 分钟才能阅读完成。
题目背景:
给你一个由 正整数 组成的数组 nums 。
返回数组 nums 中所有具有 最大 频率的元素的 总频率 。
元素的 频率 是指该元素在数组中出现的次数。
示例 1:
输入:nums = [1,2,2,3,1,4]
输出:4
解释: 元素 1 和 2 的频率为 2,是数组中的最大频率。
因此具有最大频率的元素在数组中的数量是 4。
我的分析:
简单题,简单做,一眼哈希表。先进行每个出现的元素计数,然后找到最大频率,然后将所有是最大频率的元素,他们的出现次数进行相加 最后返回。
我直接粘贴正确答案了
/**
* @param {number[]} nums
* @return {number}
*/
var maxFrequencyElements = function (nums) {
// 最大频率的元素的总频率
// 必须进行遍历 记录每个元素出现的频率,let obj = { }
// 维护一个最大值
let max = 0
for (let val of nums) {obj[val] = (obj[val] || 0) + 1
if(obj[val] > max) {max = obj[val]
}
}
let frequency = 0
for (let key in obj) {if (obj[key] === max) {frequency += obj[key]
}
}
return frequency
// 计数
};
很直白的一个题。
但在处理这个题目的时候,豆包给我的建议是:
最后在遍历 obj 的时候使用 Object.keys(obj) 然后对 obj 的键先转成整数 如:obj[parseInt(key)]
通过以上两条的处理后,代码跑不通了?wc
原来是忽视了一个问题,
根据 mdn 的描述:
Object.keys()静态方法返回一个由给定对象自身的可枚举的字符串键属性名组成的数组。由于上面 nums 是一个数组,它是一个迭代对象,它的索引是从 0 开始的。这就导致一个问题
原来这个方法 会返回一个数组,那么最后迭代 实际上是对 数组的索引进行遍历了,也就是从 0 开始
比如使用一个例子 [1,2,3,4,5]
那么此时的迭代是 0 1 2 3 4 5 显然 在上面代码的处理中并不存在对 0 的处理,所以当迭代到 0 是
if (obj[key] === max) {frequency += obj[key]
}
不会进行计数,后续数字正常计入,这就导致 总的计数少了一个。也就跑不通这一个例子。最后,豆包 想要使用 parseInt() 处理每个键,也就是 obj 对象的键,是将键通过 parseInt 转换为数字类型。这一步操作理论上是为了确保类型一致性,因为 nums 数组中的元素是数字类型。
总结
这个题目使用哈希表的知识,我记得哈希表是需要进行更新的哈哈,暂时没顾及到。
ai 也不是万能的 起码对现在的 ai,代码存在问题它并没有发现,它只使用 Object.keys(obj) 但没有将 for in 改为 for of 循环,或者不使用 Object.keys() 的选择。
豆包选择使用这两个方法,也是顾及到 要保证数据类型的一致性,但却忘了逻辑性。。。