почти возрастающая последовательность Java - PullRequest
0 голосов
/ 20 мая 2018

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

Мой код работает для 16 из 17 случаев, но я не могу придумать, как аккуратно переписать мой код, чтобы он учитывал случай, когда число больше, чем предыдущее, а также меньше, чемтот, что после того, как я написал это для цикла.Вот мой код.Случай, для которого это не работает, - это массив: [1, 2, 3, 4, 3, 6], поскольку он не рассматривает последние 3 в массиве как нарушителя, как в настоящее время создается цикл for для my.

boolean almostIncreasingSequence(int[] sequence) {

int offenderPosition = 0;
int[] arrCopy = Arrays.copyOf(sequence, sequence.length);
boolean ordered = true;


//trying to neatly rewrite this for loop 
for(int i= 0; i < sequence.length; i++){
    if(i<sequence.length-1){
        for(int j = i+1; j < sequence.length; j++) {
            if(!(sequence[i] < sequence[j])){
                ordered = false;
                offenderPosition = i;
            }
        }
    }
    if(i == sequence.length-1){
        if(!(sequence[i] > sequence[i-1])){
            ordered = false;
            offenderPosition = i; 
        }
    }

}


if(ordered == false) {
    //remove offender 
    int currentSize = arrCopy.length;
    for(int i = offenderPosition+1;i< currentSize; i++) {
        arrCopy[i-1] = arrCopy[i];
    }
    currentSize--;

    //reassign array
    arrCopy = Arrays.copyOf(arrCopy, currentSize);

    boolean lastChance = true;

    for(int i = 0; i < currentSize-1; i++){
        for(int j = i+1; j < currentSize; j++) {
            if(!(arrCopy[i] < arrCopy[j])){
                lastChance = false;
            }
        }
    }
    return lastChance;
}
else{
    return true;
}

}

1 Ответ

0 голосов
/ 20 мая 2018

Вы можете разбить код на несколько методов:

// The first method just checks if the input array is sorted
public static boolean isAscending(int[] arr) {

    boolean sorted = true;
    for (int i = 0; i < arr.length - 1; ++i) {
        if (arr[i] >= arr[i + 1]) {
            sorted = false;
            break;
        }
    }
    return sorted;
}

// The second method is the important one.
public static boolean isAlmostAscending(int[] array) {
    int[] tmpArray = new int[array.length - 1];
    // loop through all possible combinations
    for(int i = 0; i < array.length; ++i) {
        copyArray(array, tmpArray, i);
        if(isAscending(tmpArray)) {
            // if the array is sorted after skipping element i, we are done
            return true;
        }
    }
    return false;
}

// helper method to copy array and skip element at skip
private static void copyArray(int[] srcArray, int[] destArray, int skip) {
    for(int i = 0, j = 0; i < destArray.length; ++i, ++j) {
        if(i == skip) {
            ++j;
        }
        destArray[i] = srcArray[j];
    }
}

Вы можете объединить все три метода в один следующим образом:

public static boolean isAlmostAscending(int[] array) {
    int[] tmpArray = new int[array.length - 1];
    // loop through all possible combinations
    for(int index = 0; index < array.length; ++index) {

        // copyArray
        for(int i = 0, j = 0; i < tmpArray.length; ++i, ++j) {
            if(i == index) {
                ++j;
            }
            tmpArray[i] = array[j];
        }

        // check if the current array is sorted
        boolean sorted = true;
        for (int i = 0; i < tmpArray.length - 1; ++i) {
            if (tmpArray[i] >= tmpArray[i + 1]) {
                sorted = false;
                break;
            }
        }
        if(sorted) {
            // if the array is sorted after skipping element i, we are done
            return true;
        }
    }
    return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...