что не так в этом коде (палиндром java)? Кто-нибудь может подсказать, как уменьшить его сложность - PullRequest
0 голосов
/ 26 мая 2020

Следующий код дает правильный результат, как указано на странице проблемы codechef: http://www.codechef.com/problems/LAPIN, но получаю неправильный ответ при отправке, пожалуйста, сообщите мне возможную проблему с моим кодом

вот вопрос

Лапиндром определяется как строка, которая при разделении посередине дает две половины, имеющие одинаковые символы и одинаковую частоту каждого символа. Если в строке нечетное количество символов, мы игнорируем средний символ и проверяем лапиндром. Например, gaga - это лапиндром, поскольку две половины ga и ga имеют одинаковые символы с одинаковой частотой. Кроме того, abccab, rotor и xyzxy - несколько примеров лапиндромов. Обратите внимание, что abbaab НЕ является лапиндромом. Две половины содержат одинаковые символы, но их частота не совпадает. Ваша задача проста. Учитывая строку, вам нужно определить, является ли она лапиндромом.

Ввод:

Первая строка ввода содержит единственное целое число T, количество тестовых примеров.

Каждый тест представляет собой одну строку, содержащую строку S, состоящую только из строчных англичан sh алфавит.

Вывод:

Для каждого теста выведите в отдельной строке: «ДА «если строка - лапиндром, и« НЕТ », если нет.

а вот код

public class Lapindrome {

    public static void main(String[] args) {        
        Scanner sc= new Scanner(System.in);
        int t=sc.nextInt();

        for(int i=0;i<=t;i++)
        {
            String word= sc.nextLine();
            int wl= word.length();

            char[] carr= word.toCharArray();

            int fh=0;
            int lh=0;

            for(int st=0, end=wl-1 ; st<wl/2 && end>= wl/2; st++, end--) 
            {       
                fh+=carr[st];
                lh+=carr[end];  
            }

            if(fh!=0) 
            {
                if(fh==lh)System.out.println("YES");
                else System.out.println("NO");
            }
        }
        sc.close();
    }

}

1 Ответ

1 голос
/ 26 мая 2020
  1. для упрощения сложности, это как съесть слона. Как ты это делаешь? -- шаг за шагом. Сделайте методы. Имейте метод, который принимает в качестве параметра String и возвращает, является ли это лапиндромом или нет. Теперь вы выделили лог c чтения строк из системы и выяснили, является ли это лапиндромом. Это делает ваш код более гибким и снижает сложность; затем вы можете взглянуть на метод publi c boolean isLapindrome (String word) самостоятельно, не считывая биты сканера, и на правило «если да, то печатайте ДА», которое не имеет ничего общего с задача выяснить, не является ли что-то лапиндромом. Другими словами, у вас есть код, который занимается чтением ввода и записью вывода, и есть еще один фрагмент кода, который занимается выяснением того, являются ли предметы лапиндромами. Эти двое должны выполнять свои обязанности.

  2. Проблема в том, что ваш код использует ярлык, которого не должно быть. carr[st] содержит код ASCII буквы в позиции «st» в слове. Затем вы просто добавляете их. Это вызывает 2 проблемы:

    1. Для достаточно длинного слова int не покрывает то, что вам нужно. ints не может быть больше 2 ^ 31-1 (около 2 миллиардов). Я сомневаюсь, что это причина (вам нужна довольно длинная строка для go over), но это проблема с этим кодом.
    2. код ascii для a плюс код ascii для d равен ascii-код b плюс ascii-код c. Оба равны 197. Итак, ваша программа говорит, что adcb - это лапиндром.

Это домашнее задание, поэтому я думаю, дело в том, что вы выясняете, как исправить этот. Этот план добавления к единственному числу никогда не сработает. Вы должны думать о другом.

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