Можно ли разделить массив на два списка

Цель реализации — разделить массив на два подмассива, при этом сумма каждого подмассива должна быть равна. Если массив делимый, метод return true иначе вернуться false.

Например:

Этот массив можно разделить на две части, и сумма каждой части массива равна 5.

int[] array = {4, 1, 1, 3, 1}; // true {4, 1} , {1, 3, 1}

Этот массив можно разделить на две части, и сумма каждой части массива равна 4.

int[] array1 = {5, 4, -5, 3, 1}; // true {5, 4, -5} , {3, 1}

Этот массив можно разделить на две части, и сумма каждой части массива равна 5.

int[] array2 = {3, 2, -5, 10}; // true {3, 2} , {-5, 10}

Этот массив нельзя разделить.

int[] array3 = {10, 11, 15, 8}; // false

С нетерпением жду других подходов. Спасибо.

Код:

public class SplitArray {

    public static void main(String[] args) {

        int[] array = {4, 1, 1, 3, 1};
        int[] array1 = {5, 4, -5, 3, 1}; 
        int[] array2 = {3, 2, -5, 10}; 
        int[] array3 = {10, 11, 15, 8}; 

        System.out.println(  isSeparable(array) );
        System.out.println(  isSeparable(array1) );
        System.out.println(  isSeparable(array2) );
        System.out.println(  isSeparable(array3) );
    }

    private static boolean isSeparable(int[] array) {

        if (array.length == 0)
            return false;

        int sum = 0;

        for(int i=0;i<array.length;i++) {
            sum += array[i];
        }

        if(sum % 2 == 1){
            return false;
        }

        int expectedSum = sum / 2;
        int tempSum = 0;
        for(int i=0;i<array.length;i++) {
            tempSum += array[i];
            if(tempSum == expectedSum) {
                return true;
            }
        }

        return false;
    }
}

1 ответ
1

Целью внедрения является разделить массив на два подмассива что сумма каждого подмассива должна быть равна. Если массив делимый, тогда метод return true, иначе return false.

Цель явно не достигается вашим кодом; ты никогда на самом деле разделить массив. Либо требования неверны, либо код неправильный. В этот момент вам следует попросить разъяснений. Поверьте мне: как архитектор я знаю, как все может быстро пойти под откос; требования должны быть очень точными. Во-первых, теперь у вас класс SplitArray который никогда не разбивает массив.

Кроме того, свойство «разделяемый» довольно специфично, а это значит, что оно должно быть четко описано в коде с помощью комментариев. В противном случае вы позже посмотрите свой код и задаетесь вопросом, что, черт возьми, он должен был делать.


Выбранная стратегия верна и эффективна. Мне нравится, что он не использует двойники и что он возвращает true или false всякий раз, когда это возможно. Это очень высокий уровень (программисты на C, которым приходится беспокоиться о распределении ресурсов, не согласятся, но для Java это нормально).


System.out.println(  isSeparable(array) );

Не используйте ручное форматирование кода, просто используйте:

 System.out.println(isSeparable(array));

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


private static boolean isSeparable(int[] array) {

Возможно, это не часть этого упражнения, но обычно вы создаете int separableIndex(int[] array) и постоянный NOT_SEPARABLE = -1. Таким образом, вы не просто узнаете, разделяется он или нет, но вы также можете решить выполнить фактическое разделение позже. Если вы разрешаете отрицательные значения, его следует назвать firstSeparableIndex или вернуть полный список индексов, в зависимости от того, что требуется (например, {-1, 1, -1, 1, -1, 1 } можно разделить двумя способами).


    if (array.length == 0)
        return false;

Всегда используйте скобки в if. Здесь вы говорите, что вы не можете разделить массив на две части, если он пуст. Однако уверены ли вы, что правильно уловили границы? Может { 0 } быть разбитым на массив из 1 и пустой массив? Как насчет { 1, -1 }? Разве этот метод не всегда возвращает true пока массив содержит элементы? Проблема здесь в том, что вы используете деление для проверки правильности. Если бы вы разрешили только два или более элементов, все было бы в порядке.

Если бы это было частью библиотеки, вам, возможно, даже придется учитывать количество битов и реализацию с двумя дополнениями int, иначе вы можете промахнуться Integer.MAX_VALUE или даже по круговой системе. Я думаю, это слишком далеко для этого упражнения.

Всегда проверяйте свои граничные условия.


    for(int i=0;i<array.length;i++) {

Пожалуйста, используйте больше пробелов или выполните очистку кода / запустите программу форматирования перед тем, как поделиться своим кодом (вы сейчас же поделитесь своим кодом!).


int sum = 0;

if(sum % 2 == 1){
    return false;
}

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

См. Обсуждение здесь если вы хотите учитывать отрицательные значения. И да, почему бы не создать isEven или isOdd функция?

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

// sub-arrays of integers can not add up to a fraction

Или что-то вдоль этих линий.


    for(int i=0;i<array.length;i++) {

Опять пробел. Пожалуйста, соблюдайте соглашения о кодировании Java.

Но вы также перегибаетесь: вы могли и, вероятно, должны были пойти на array.length - 1 здесь, чтобы вы знали, что в окончательном массиве будет хотя бы 1 элемент.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *