UT7 Ответов: 3

Пытаюсь решить вопрос о двоичном разрыве кодильности, но мой код ужасен! ! !


Привет всем, я пытаюсь решить вопрос двоичного разрыва codility BinaryGap coding task - учитесь кодировать - Codility[^] но мое решение ужасно, и это вызовет у вас головную боль, но мне нужна помощь, чтобы заставить его работать.
My logic is (1) Convert integer N to binary format (2) Store binary format in a character array (3) Loop through character array starting from the left (the end of the character array) and discard any trailing '0s' till we find the first '1'. (4) If the next character after the first '1' is '0', count the number of '0s' till we find another '1'. (5) If there are still some characters in the array, repeat steps 3 and 4, else return the number of '0s' found as binary gap. This logic should work but putting into good concise Java code is my problem. Please my code is terrible and i couldn't complete it, please if it offends you, kindly forgive me, thanks for any help.

Что я уже пробовал:

public int solution(int N) {

    int currentGap = 0, largestGap = 0;

    int binaryGap = 0;
    // Convert integer to binary value
    String binaryString = Integer.toBinaryString(N);

    // Put binary value in a charater array
    char [] characters = binaryString.toCharArray();

    // Run a loop starting from the left and check if the characters are 0 or 1
    int j = 0;
    for(int i = characters.length - 1; i < characters.length; i--){
           char c = characters[i];
    // Disregard all trailing zeros till we get to the first 1
        if(c == '1'){
            j++;
        }else if(c == '0'){
            // Needs to delete trailing zeros ?
        }
    }

    // I want to set currentGap to the number of zeros before getting to another 1
    // then repeat the entire process above if there are still characters in the character array

    if(currentGap == largestGap){
        return currentGap;
    }else if(currentGap < largestGap){
        largestGap = binaryGap;
    }
    return binaryGap;
}

3 Ответов

Рейтинг:
2

OriginalGriff

Это ужасное решение: оно никогда не будет быстрым, чистым или эффективным. Преобразование числа строки-это очень плохой способ начать, так как это означает, что система просматривает каждый бит входных данных еще до того, как вы начнете их просматривать!

Вместо этого посмотрите на Операторы бинарных манипуляций Java: https://www.vojtechruzicka.com/bit-manipulation-java-bitwise-bit-shift-operations/[^] - в частности, операторы AND, XOR и SHIFT.

Если вы хотите создать действительно эффективный метод, то посмотрите здесь: A C# реализация AI MEMO 239, пункт 169 - подсчитайте один бит в числе[^] - так и будет нет делайте, что хотите, но это может дать вам ключ к пониманию того, что вы можете сделать с эффективным алгоритмом и битовой манипуляцией ...


Maciej Los

5ed!

Рейтинг:
0

Patrice T

Цитата:
но мой код ужасен! ! !

Воистину, ужасное это слово.
Вы начинаете с 1 идеи (currentGap, largestGap, binaryGap), затем переключаетесь на другую идею в цикле, а затем возвращаетесь к первой идее, пытаясь выплюнуть результат.
Полное переписывание в порядке.
Совет: решите проблему вручную, запишите, как вы это сделали, решите проблему снова, применив процедуру, измените процедуру по мере необходимости.
Когда процедура работает, это ваш алгоритм, напишите код соответственно.

Чтобы помочь вам понять, как ведет себя ваш код, используйте отладчик и наблюдайте за его выполнением.
-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
0

UT7

@OriginalGriff, @Patrice T, большое спасибо.