javascript - 如何解决 Codility equiLeader 挑战
问题描述
找到“领导者”后,我尝试在给定数组中找到可能的 equiLeaders 但找不到。试图找到其他人的解决方案,但无法理解他的所作所为。
我对我在他的代码中迷失的部分发表了评论。能得到它的人可以引导我完成那部分吗?尤其是那些计算
这是他的解决方案
function solution(A) {
// I understand this part as he was trying to find the leader
if (A.length === 1) return 0
let maxRepetition = 1;
let maxIndex = -1
let occurance = new Object()
for (let i = 0; i < A.length; i++) {
if (occurance.hasOwnProperty(A[i])) {
occurance[A[i]][0]++
if (occurance[A[i]][0] > maxRepetition) {
if (occurance[A[i]][0] > A.length / 2) {
maxRepetition = occurance[A[i]][0]
maxIndex = occurance[A[i]][1]
}
}
}
else {
occurance[A[i]] = new Array()
occurance[A[i]][0] = 1
occurance[A[i]][1] = i
}
}
leader = A[maxIndex]
// THis is the part I am not getting where he was trying to get the possible equiLeaders
let equiLeader = 0
let stack = []
let stackIndex = -1
for (let i = 0; i < A.length; i++) {
if (stack.length > (Math.floor(i / 2)) && (maxRepetition - stack.length > Math.floor((A.length - i) / 2))) {
equiLeader++
}
if (A[i] === leader) stack.push(i)
}
return equiLeader
}
这是完整的问题
给定一个由 N 个整数组成的非空数组 A。
这个数组的前导是出现在 A 的一半以上元素中的值。
equi leader 是一个索引 S 使得 0 ≤ S < N - 1 和两个序列 A[0], A[1], ..., A[S] 和 A[S + 1], A[S + 2 ], ..., A[N − 1] 具有相同值的领导者。
例如,给定数组 A 满足: A[0] = 4 A[1] = 3 A[2] = 4 A[3] = 4 A[4] = 4 A[5] = 2
我们可以找到两个 equi 领导者:
0, because sequences: (4) and (3, 4, 4, 4, 2) have the same leader, whose value is 4. 2, because sequences: (4, 3, 4) and (4, 4, 2) have the same leader, whose value is 4.
目标是计算 equi 领导者的数量。
写一个函数:
function solution(A);
即,给定一个由 N 个整数组成的非空数组 A,返回 equi 领导者的数量。
例如,给定: A[0] = 4 A[1] = 3 A[2] = 4 A[3] = 4 A[4] = 4 A[5] = 2
如上所述,该函数应返回 2。
为以下假设编写一个有效的算法:
N is an integer within the range [1..100,000]; each element of array A is an integer within the range [−1,000,000,000..1,000,000,000].
解决方案
我找到了一个解决方案,它非常简单,如果我们可以找到任何元素的最大值,并且通过第二个循环将其分成两个就可以产生正确的结果。
这是使用Javascript的代码,请看。
function solution(A) {
// write your code in JavaScript (Node.js 8.9.4)
let totalEleFound = {};
for(let i=0;i<A.length;i++){
if(!totalEleFound[ A[i] ]){
totalEleFound[ A[i] ] = 1;
}
else{
totalEleFound[ A[i] ]++;
}
}
//console.log("totalEleFound",totalEleFound);
let maxOccures = 0;
for(const [key,value] of Object.entries(totalEleFound) ){
maxOccures = Math.max(maxOccures,Math.floor(value/2))
}
return maxOccures;
}
祝你编码愉快,干杯。
推荐阅读
- android - Google Maps Android SDK - addMarker() 似乎不适用于某些类型的设备
- php - 组合 php 和 html 代码有错误 - 除最后一个 li 标记外,所有 li 标记中的 hr 标记内
- javascript - Vue 失去反应
- reactjs - 从 redux-saga 调用组合重选选择器
- numpy - Numpy:np.abs 到底是如何工作的?
- vue.js - element-ui中的可排序问题
- html - 具有混合设计的显示柔性
- laravel - 使用 inno 安装程序创建安装程序后,我的 laravel php 桌面应用程序无法工作
- python - 将 Python 版本 3.7 降级到 3.6
- python - 如何修改代码以实现输出“12333”?现在它输出 NONE