2016-04-06 76 views
-3

選舉正在進行中!找到仍有機會贏得選舉的候選人人數

考慮給每個候選人到目前爲止, 和整數k誰沒有投他們的票呢, 發現誰還是有機會的候選人數選民票數的數字陣列贏得選舉。

選舉的獲勝者必須獲得比其他候選人更多的選票。 如果兩名或兩名以上的候選人獲得相同(最多)的選票數,則 假設根本沒有贏家。

對於票= [2,3,5,2],且k = 3時,輸出應該是 electionsWinners(票中,k)= 2

對於票= [ 1,3,3,1,1]且k = 0時,輸出應該是 electionsWinners(票中,k)= 0。

對於票= [5,1,3,1,4]和k = 0,輸出應該是 選舉韋恩rs(票數,k)= 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'聲明是不必要的冗長,E。 G。如果(k!= 0)A else if(k == 0)B'可以簡化爲'if(k!= 0)A else B'; 'if(counter == 1)counter = 1' is redundant –

回答

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你必須檢查是否有一個候選人的最高票數。所以我希望你的代碼看起來像下面的僞代碼:

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