2016-04-06 1 views
-3

Выборы в настоящее время!найти число кандидатов, которые все еще имеют шанс выиграть выборы

Учитывая массив чисел голосов, поданных за каждого из кандидатов до сих пор, и целое число к числу избирателей, не отдать свой голос еще, найти число кандидатов, которые все еще есть шанс чтобы выиграть выборы.

Победитель выборов должен обеспечить строго больше голосов, чем любой другой кандидат. Если два или более кандидатов получают одинаковое (максимальное) количество голосов, предполагают, что победителя вообще нет.

Пример

Для получения голосов = [2, 3, 5, 2] и к = 3, выходной сигнал должен быть electionsWinners (голоса, к) = 2.

Для голосов = [ 1, 3, 3, 1, 1] и к = 0, то выход должен быть electionsWinners (голоса, K) = 0.

Для голосов = [5, 1, 3, 1, 4] и k = 0, выход должен быть electionWinne RS (голоса, к) = 1.

int electionsWinners(int[] votes, int k) { 

int max = votes[0]; 
int counter = 0; 

/* I assumed all the voters who haven't cast their vote, 
votes only 1 candidate */ 

for(int i = 1; i < votes.length; i++) { 
    //getting the candidate who has the highest vote. 
    if(votes[i] > max) { 
     max = votes[i]; 
    } 
} 

// count the candidates who still have the chance to win. 
for(int i = 0; i < votes.length; i++) { 
    if(k != 0){ 
     if((votes[i] + k) > max) { 
     counter++; 
     }  
    } else if(k == 0) { 
     /* if there is no voters left to vote, 
     and the candidates who has the highest vote will be the winner. 
     and if two or more candidates recieve the same(maximum) number of votes, 
     assume there is no winner. */ 

     // count the no. of candidates who recieve the same(maximum) number of votes. 
     if(votes[i] == max) { 
     counter++; 
      if(counter == 1) { 
       counter = 1; 
      } else { 
       counter = 0; 
      } 
     } 
    } 
} 
return counter; 
} 

Я новичок в программировании. пытаясь изо всех сил решить это, и это мой код. Я просто задаюсь вопросом, есть ли для этого упрощенное решение.

+5

Я рекомендую разместить на http://codereview.stackexchange.com/ – assylias

+0

'if' заявления излишне многословным, е. г. 'if (k! = 0) A else if (k == 0) B' можно упростить до' if (k! = 0) A else B'; 'if (counter == 1) counter = 1' является избыточным –

ответ

2

Я не думаю, что ваш код будет работать, для k = 0 и количество кандидатов с максимальным количеством голосов будет равно 2 * n + 1, например. [1, 3, 3, 3, 1].
Почему? Из-за этой части:

if(votes[i] == max) { 
    counter++; 
    if(counter == 1) { 
    counter = 1; 
    } else { 
    counter = 0; 
    } 
} 

Так что если вы нашли 2 кандидата с максимальным количеством голосов, вы сбросите счетчик. Затем, когда вы найдете другой, вы увеличиваете его до 1, и если больше нет кандидатов с максимальным количеством голосов, вы возвращаете 1, что явно неверно.

код в цикле должен действительно быть просто

... 
} else if (k == 0 && votes[i] == max) { 
    counter++; 
} 

И вне цикла for, вы делаете быструю проверку

if (k == 0 && counter > 1) 
    counter = 0; 
+0

Теперь я понимаю, что не так в моем коде. спасибо @radoh –

1

Первое, текущее решение не является правильным. В частности, код

if (counter == 1) { 
    counter = 1; 
} ... 

Очень странно: если счетчик равен 1, то установка его на 1 не влияет. Что происходит, когда k == 0: counter переключает между 0 и 1, что не то, что вы хотите. Попробуйте ваше решение с 3 кандидатами с наибольшим количеством голосов.

Вы правильно заметили, что есть два случая: если k != 0, вы должны проверить каждого кандидата, выиграет ли он, когда все остальные избиратели голосуют за него/нее. Если k == 0 вы должны проверить, есть ли у одного кандидата наибольшее количество голосов.Поэтому я хотел бы ожидать, что ваш код выглядеть следующим псевдо-кодом:

determine maximum number of votes; 

if (k != 0) { 
    int counter = the number of candidates who win when all k votes are cast for him/her; 
    return counter; 
} else { 
    int numOfWinners = the number of candidates with a maximum number of votes; 
    return (numOfWinners == 1) ? 1 : 0; 
} 
+0

last 'else' может быть упрощен:' return (...)? 1: 0' –

+0

@SashaSalauyou. Хорошо. Но это псевдокод. Поскольку английские инструкции требуют циклов, я не хотел полагаться на то, что они слишком сильно играют роль выражений. – Hoopje

Смежные вопросы