设计一个计票器(Design a vote counting machine)

题目:请设计一个计票器程序,通过输入有效候选人列表和投票结果,计算出1.每个有效候选人的票数;2.无效票数;3.获得票数最多的人。

注意:如果候选人的票数相同,则通过候选人列表中候选人的顺序决定谁胜出。如果票数中的无效票多于最高票候选人的票数或者票数为空,则无人获胜。

举例:

  • 例1:

Input:

        Valid Candidates Name ["A","B","C"]

        Vote Casted["A","F","A","B","A","B","A","C","E"]

Output:

        A=4 B=2 C=1 incalidVotes=2 Winner = A

  • 例2:

Input:

        Valid Candidates Name["A","C","B"]

        Vote Casted["A","F","B","B","B","C","C","C","E"]

Output:

        A=1 B=3 C=3 invalidVotes=2 Winner = C

(B、C票数相同,但是候选人列表中C的位置靠前,所以C获胜)

  • 例3:

 Input:

        Valid Candidates Name["A","C","B"]

        Vote Casted["R","F","G","B","B","K","L","C","E"]

Output:

        A=0 C=1 B=2 invalidVotes=6 Winner = N/A

 代码:

def sum_char(string, char):
    str1 = list(string)
    count = 0
    for i in range(len(string)):
        if str1[i] == char:
            count += 1
    return count


def counting_machine(valid_candidates_name, vote_casted):
    valid_candidates_name = list(valid_candidates_name)  # 候选人列表
    vote_casted = list(vote_casted)  # 投票情况列表
    unless_vote = (list(set(vote_casted).difference(set(valid_candidates_name))))  # 无效列表,取差集获得

    vote_casted_str = ','.join(str(i) for i in vote_casted)
    vote_casted_list = list(vote_casted_str)

    unless_vote_count = len(unless_vote)  # 无效票数

    vote_count = {}  # 统计投票情况字典:候选人:票数,eg.A:5

    vote_count_str = ""

    winner = []  # 胜出者
    winner_index = []  # 胜出者在候选者列表中的index

    for item in valid_candidates_name:
        vote_count.setdefault(item, sum_char(vote_casted_list, item))

    for key, value in vote_count.items():
        if value == max(vote_count.values()):
            winner.append(key)

    for item in winner:
        winner_index.append(valid_candidates_name.index(item))

    for key, value in vote_count.items():
        vote_count_str = str(vote_count_str) + str(key) + "=" + str(value) + " "

    winner = valid_candidates_name[min(winner_index)]

    if vote_count[winner] == 0 or vote_count[winner] < unless_vote_count:
        winner = "N/A"

    result = vote_count_str + "invalidVotes=" + str(unless_vote_count) + " " + "Winner = " + winner

    print(result)


if __name__ == '__main__':
    num1 = int(input())
    i = 0
    valid = ""
    vote = ""
    while i != num1:
        valid = valid + input()
        i = i + 1
    i = 0
    num2 = int(input())
    while i != num2:
        vote = vote + input()
        i = i + 1
    counting_machine(valid, vote)

测试:

  • 例1:

输入:

3
A
B
C
9
A
F
A
B
A
B
A
C
E

输出:

  •  例2:

输入:

3
A
C
B
9
A
F
B
B
B
C
C
C
E

输出:

 

  • 例3:

输入:

3
A
C
B
9
R
F
G
B
B
K
L
C
E

输出:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值