Javascript 如何解决领导者的挑战
在找到“leader”后,我尝试在给定数组中找到可能的equalleader,但没有找到。我试图找到其他人的解决办法,但对他所做的事却束手无策 我在他的代码中丢失的部分留下了评论。有人能帮我看完这部分吗。尤其是那些计算 这就是他的解决方案Javascript 如何解决领导者的挑战,javascript,algorithm,Javascript,Algorithm,在找到“leader”后,我尝试在给定数组中找到可能的equalleader,但没有找到。我试图找到其他人的解决办法,但对他所做的事却束手无策 我在他的代码中丢失的部分留下了评论。有人能帮我看完这部分吗。尤其是那些计算 这就是他的解决方案 function solution(A) { // I understand this part as he was trying to find the leader if (A.length === 1) return 0 let
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
}
目标是统计equi领导者的数量
编写一个函数:
function solution(A);
给定一个由N个整数组成的非空数组a,返回
平等领导者的数量
例如,假设:
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].
我想我们都同意,最难理解的部分是这一部分
if (stack.length > (Math.floor(i / 2)) &&
(maxRepetition - stack.length > Math.floor((A.length - i) / 2))) {
equiLeader++
}
我将把maxreption
重命名为countOfLeadingValues
,因为它是整个数组/列表中存在的前导值的数量。举个简单的例子
[2,4,4,4,4,4,6]
然后countOfLeadingValues==5
我也要搬家了
if (A[i] === leader) stack.push(i)
在问题线之上,因为这样做更有意义。当当前元素等于leader值时(在本例4中),我们将推送到堆栈
看看第一个条件
stack.length > (Math.floor(i / 2))
countOfLeadingValues - stack.length > Math.floor((A.length - i) / 2)
这里发生的事情是,我们确保当前堆栈中至少有一半的元素等于前导值(即,否则它就不会是equileader)
所以
将为false(如果4是数组中的前导值)
但是
将为true(如果4是数组中的前导值),因此这将是一个等前导值,因为它的主导值也是前导值
在第二种情况下
stack.length > (Math.floor(i / 2))
countOfLeadingValues - stack.length > Math.floor((A.length - i) / 2)
在左手边
countOfLeadingValues - stack.length
当我们遍历数组/列表时,将逐渐变小,因为第一个项是常量(示例中为5),第二个项随着每个equileader匹配(每个元素为4)而递增。我们要检查堆栈是否还没有达到前导值的总数
然后
当我们接近阵列末端时,将逐渐变大。我们还没有完成阵列的一半,因此我们将尽可能高效,而不是穷尽。从Codibility学习材料中:
如果大于n/2,则我们找到了领导者;否则,序列不包含引线
我想我们都同意,最难理解的部分是这一部分
if (stack.length > (Math.floor(i / 2)) &&
(maxRepetition - stack.length > Math.floor((A.length - i) / 2))) {
equiLeader++
}
我将把maxreption
重命名为countOfLeadingValues
,因为它是整个数组/列表中存在的前导值的数量。举个简单的例子
[2,4,4,4,4,4,6]
然后countOfLeadingValues==5
我也要搬家了
if (A[i] === leader) stack.push(i)
在问题线之上,因为这样做更有意义。当当前元素等于leader值时(在本例4中),我们将推送到堆栈
看看第一个条件
stack.length > (Math.floor(i / 2))
countOfLeadingValues - stack.length > Math.floor((A.length - i) / 2)
这里发生的事情是,我们确保当前堆栈中至少有一半的元素等于前导值(即,否则它就不会是equileader)
所以
将为false(如果4是数组中的前导值)
但是
将为true(如果4是数组中的前导值),因此这将是一个等前导值,因为它的主导值也是前导值
在第二种情况下
stack.length > (Math.floor(i / 2))
countOfLeadingValues - stack.length > Math.floor((A.length - i) / 2)
在左手边
countOfLeadingValues - stack.length
当我们遍历数组/列表时,将逐渐变小,因为第一个项是常量(示例中为5),第二个项随着每个equileader匹配(每个元素为4)而递增。我们要检查堆栈是否还没有达到前导值的总数
然后
当我们接近阵列末端时,将逐渐变大。我们还没有完成阵列的一半,因此我们将尽可能高效,而不是穷尽。从Codibility学习材料中:
如果大于n/2,则我们找到了领导者;否则,序列不包含引线
在C++中用100%。< /P>回答
int解决方案(向量&A){
//用C++14(g++6.2.0)编写代码
int leader,leadercnt=0,element=0,cnt=0,leaderfound=0,seq=0,候选者=0;
对于(uint i=0;i0)
{
候选者=元素;
leadercnt=cnt;
}
cnt=0;
对于(uint i=0;i(int)A.size()/2)
{
leaderfound=1;
领导=候选人;
leadercnt=cnt;
}
如果(leaderfound==0)
{
//printf(“返回0未找到任何引线\n”);
返回0;
}
int nonleadercnt=A.size()-leadercnt;
int无引线CNTL=0;
int leadercnt=leadercnt;
int leadercntl=0;
//printf(“找到了leader%d和leadercnt%d\n”,leader,leadercnt);
对于(uint i=0;i非领先NTL)和&(领先NTR>非领先NTR))
{
seq++;
}
}
返回顺序;
C++中的P><P>P>100%。
int解决方案(向量&A){
//用C++14(g++6.2.0)编写代码
int leader,leadercnt=0,element=0,cnt=0,leaderfound=0,seq=0,候选者=0;
对于(uint i=0;i0)
{
候选者=元素;
leadercnt=cnt;
}
cnt=0;
对于(uint i=0;i(int)A.size()/2)
{
leaderfound=1;
领导=候选人;
leadercnt=cnt;
}
如果(leaderfound==0)
{
//printf(“返回0未找到任何引线\n”);
返回0;
}
int nonleadercnt=A.size()-leadercnt;
int无引线CNTL=0;
int leadercnt=leadercnt;
int leadercntl=0;
//printf(“找到了leader%d和leadercnt%d\n”,leader,leadercnt);
对于(uint i=0;i非领先NTL)和&(领先NTR>非领先NTR))
{
seq++;
}
}
返回顺序;
}这是我的Java解决方案。结果100%和O(N)。 代码的第一部分是查找(如果有)数组中最频繁的数字(max)和num