Java-Для проверки, является ли строка четной (FFHHIIJJ, UUURROOOR, ..) или нечетной (IIREELO, PPGIUUUUS, ..) - PullRequest
0 голосов
/ 28 июня 2019

в Java, мне нужно проверить, является ли данная строка четной или нечетной.

Четная строка будет иметь одинаковое количество символов (HHEEPPDIDI, LLLQQMQMM, ...) Нечетная строка будет иметь неравное количество символов (HRTRDFF, HIYUDHDA, ...)

Я попытался подсчитать вхождение каждого символа и поместил это значение в одну переменную INT и сравнил значения переменной INT. Но это не похоже на эффективный код.

  int frequency = 0;

        for(int i = 0; i < str.length(); i++) {
            if(ch == str.charAt(i)) {
                ++frequency;
            }

Таким образом, мы можем посчитать каждый символ и сравнить его значение. Но я хочу знать, есть ли какой-либо другой простой метод или мы можем использовать любые встроенные методы для его достижения. Мы можем использовать до версии Java 8. Любая помощь по этому вопросу будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Так в java 8 или более поздней версии, есть ли какие-либо строковые методы API, которые упростит требование.

Если вы хотите, в Java 8 и выше вы можете использовать потоковый API, сначала для построения карты отсчетов (в Java 9, начиная с str.chars()), затем для определения того, содержит ли карта разные подсчеты. Считаешь ли ты, что это проще, вероятно, больше зависит от вкуса (я бы посчитал это более продвинутым, и мне это нравится).

Вы можете искать детали в Интернете и переполнении стека. Если вы застряли, пожалуйста, напишите новый вопрос, мы здесь, чтобы помочь.

РЕДАКТИРОВАТЬ: Я думал, что у вас уже есть время, чтобы написать свой собственный код, поэтому я выкладываю мой для вас, чтобы вы могли сравнить, если хотите, не отвлекаясь от обучения.

public static boolean isEven(String s) {
    if (s.isEmpty()) {
        return true;
    }
    Map<Integer, Long> counts = s.chars()
            .boxed()
            .collect(Collectors.groupingBy(ch -> ch, Collectors.counting()));
    Long someCount = counts.values().iterator().next();
    return counts.values()
            .stream()
            .allMatch(someCount::equals);
}

Давайте попробуем:

    for (String s : new String[] {
            // Even strings
            "FFHHIIJJ", "UUURROOOR", "HHEEPPDIDI", "LLLQQMQMM", "abaccb", "abc", "d", "",
            // Odd strings
            "IIREELO", "PPGIUUUUS", "HRTRDFF", "HIYUDHDA", "abbc", "aabcc" }) {
        System.out.format("%-11s %b%n", s, isEven(s));
    }

Вывод:

FFHHIIJJ    true
UUURROOOR   true
HHEEPPDIDI  true
LLLQQMQMM   true
abaccb      true
abc         true
d           true
            true
IIREELO     false
PPGIUUUUS   false
HRTRDFF     false
HIYUDHDA    false
abbc        false
aabcc       false
0 голосов
/ 28 июня 2019

Вы можете перебрать строку ввода и добавить char на char в структуру данных (HashMap) с увеличенным счетчиком.

import java.util.HashMap;

public class A02 {

public static void main(String[] args) {

    System.out.println(new A02().new Solution().check("HHEEPPDIDI"));
    System.out.println(new A02().new Solution().check("HHEEPPDID"));
    System.out.println(new A02().new Solution().check("HRTRDFF"));
}

class Solution
{
    HashMap<Character,Integer> hm = new HashMap<>();

    public String check(String s)
    {
        for(int i=0;i<s.length();i++)
        {
            if(hm.get(s.charAt(i))==null)
            {
                hm.put(s.charAt(i), 1);
            }
            else
            {
                hm.put(s.charAt(i),hm.get(s.charAt(i))+1);
            }
        }
        int first = 0;
        for(Character c : hm.keySet())
        {
            if(first==0) first=hm.get(c);
            if(first !=hm.get(c)) return "odd:"+s;
        }
        return "even:"+s;
    }
}
}

Выход:

even:HHEEPPDIDI
odd:HHEEPPDID
odd:HRTRDFF

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

Обновление для Java 8

public String check(String s)
{   
    //place the string into a map by chars with counter 
    Map<Integer,Long> map = 
    s.chars().boxed().collect(Collectors.groupingBy(t -> t, Collectors.counting()));

    //check map by value - if values are the same then even and map size=1
    int size = 
    map.values().stream().collect(Collectors.groupingBy(t -> t)).keySet().size();

    if(size==1 || size==0) return "even:"+s;
    return "odd:"+s;
}

вывод для пустого ввода:

even:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...