Лидер по тестированию APAC 2016 года в стране

#java #algorithm

#java #алгоритм

Вопрос:

Я пытаюсь использовать вопрос Google APAC для практики, но в отправке говорится, что мое решение неверно.

Конституция определенной страны гласит, что лидером является человек с именем, содержащим наибольшее количество различных букв алфавита. (В стране используется английский алфавит в верхнем регистре от A до Z.) Например, название GOOGLE состоит из четырех разных букв алфавита: E, G, L и O. Название APAC CODE JAM состоит из восьми разных букв. Если страна состоит только из этих двух человек, APAC CODE JAM будет лидером.

При равенстве голосов лидером становится человек, чье имя появляется раньше всех в алфавитном порядке.

Учитывая список имен граждан страны, можете ли вы определить, кто является лидером?

Я не могу понять, почему моя отправка приводит к неправильному ответу. Не могли бы вы любезно указать, где я допустил ошибки?

Я также был бы признателен за любые отзывы об улучшении моего решения.

Заранее большое спасибо.

 import java.io.*;
import java.util.*;

public class CountryLeader {
    public static void main(String[] args) {    
        Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
        int t = in.nextInt();
        in.nextLine();
        for (int i = 1; i <= t;   i) {
            int n = in.nextInt();
            in.nextLine();
            List<String> names = new ArrayList<String>();
            for (int j = 0; j < n;   j) {
                names.add(in.nextLine());
            }
//            System.out.println(names);
            System.out.println("Case #"   i   ": "   findLeader(names));
        }

    }

    public static String findLeader(List<String> names) {     
        String leader = "";
        int maxCount = 0;

        for (String name : names) {
            String current = name.replaceAll(" ","");;
            char[] charArr = current.toCharArray();
            int counter = 0;
            Map<Character, Boolean> charMap = new HashMap<Character, Boolean>();

            for (Character ch : charArr) {
                if (charMap.containsKey(ch))  {
                   continue; 
                } else {
                    charMap.put(ch, true);
                    counter  ; 
                }
            }

            if (maxCount < counter) {
                leader = name;
                maxCount = counter;
            }
        }

        return leader;
    }
}
  

Эти тесты, которые я пробовал, и, похоже, они работают нормально:

 3
3
ADAM
BOB
JOHNSON
2
A AB C
DEF
8
ABC DE
A B C D E F G
AB
A
BBBBBBBBBBBBBBBBBBBBBBBBB
AAAAAAAAAAAAKKKKKKKKKKKKKKKCCCCCCCCc
ABCDEFGHIJKLM
CDEFGHIJKLMNO
  

Вывод:

 Case #1: JOHNSON
Case #2: A AB C
Case #3: ABCDEFGHIJKLM
  

Ответ №1:

Вы забыли проверить алфавитный порядок, если две строки содержат одинаковое количество различных символов. Это можно довольно легко исправить, добавив дополнительное if -предложение в findLeader :

 if (maxCount < counter) {
    leader = name;
    maxCount = counter;
} else if(maxCount == counter amp;amp; name.compareTo(leader) < 0) {
    // same number of distinct character => lexicographical ordering
    leader = name;
    maxCount = counter;
}