2015-02-20 2 views
-1

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

Мой код, по-видимому, работает для моей второй идеи .. но не находит правильный элемент массива max.

Мой массив имеет следующие значения {6, 3, 5, 2, 7, 9, 4}. Он находит максимальный элемент массива будет 7 .. это должно быть 9.

public void deleteMax() { 
    // set value for comparison starting from the beginning of the array 
    int arrayMax = arr[0]; 

    for (int i = 0; i < nElems; i++) { 
    if (arr[i] > arrayMax) { 
     arrayMax = arr[i]; 

     for (int k = i; k < nElems; k++) { 
      arr[k] = arr[k + 1]; 
      nElems--; 

      break; 
     } 
     } 
    } 
} 
+1

Не проще ли просто 'sort()' массива, а затем захватить первый элемент? Что-то вроде 'var max = ary.sort (function (a, b) {return a> b;}). Pop();' – brbcoding

+0

Java! == JavaScript –

+0

Массив должен быть несортирован. – Chewy

ответ

1

почему бы не использовать JQuery $ .grep & Math.max как:

var arr = [6, 3, 5, 2, 7, 9, 4]; 
var maxNum = Math.max.apply(null, arr); 

var newArr = $.grep(arr, function(n) { 
    return n != maxNum; 
}); 
console.log(newArr); 

Fiddle

EDIT : Хорошо, что вы не использовали Java как вопрос, указанный в разделе JavaScript ...

в Java, Вы можете найти максимальное число в массиве, как

int maxNum = arr.get(0); // get the first number in array 
for (int i = 1; i < arr.length; i++) { 
    if (arr.get(i) > maxNum) { 
     maxNum = array.get(i); 
    } 
} 
arr.remove(maxNum); 
0

Ну ,, вам не нужен какой-либо второй цикл.

Только один цикл и две переменные, называемые f.ex. MaxElementPosition и MaxElementValue, которые обновляются каждый раз внутри цикла, если число в этой позиции больше последнего MaxElementValue, обновляет как значение, так и позицию.

В то время как цикл вам нужен для сравнения. В конце вам нужна только позиция.

0

Ваша внутренняя петля не имеет значения, у вас есть только 1D массив, поэтому нет смысла делать какую-либо внутреннюю итерацию.

Если вы настаиваете на не выполняя не sorting на массив, то вы могли бы сделать что-то вроде этого:

public void deleteMax() { 
    // set value for comparison starting from the beginning of the array 
    int arrayMax = arr[0]; 
    int maxIndex = 0; 

    for (int i = 0; i < nElems; i++) { 
     if (arr[i] > arrayMax) { 
      arrayMax = arr[i]; 
      maxIndex = i; 
     } 
    } 

    arr.remove(maxIndex); 
} 

После отделки петель в for, мы удаляем этот пункт на maxIndex

+0

Ok .. Не мог ли я получить следующий элемент, начинающийся с max, а затем swap max с arr [i + 1]. Как бы я это сделал? – Chewy

+0

Зачем вам это нужно? Это всегда будет иметь максимальное значение и соответствующий ему индекс, который вы можете удалить - любая дополнительная сложность не нужна – Alex

0

@Alex на правильный трек, но нет функции удаления, которую можно вызвать в массиве в java. Все, что вам нужно, это переменная maxIndex, которую он получает, что, конечно же, будет первым вступлением этого максимума, поэтому, если вам нужно удалить каждое появление максимума, это будет другой проблемой. Поэтому, как только вы используете @Alex код:

int arrayMax = arr[0]; 
int maxIndex = 0; 

for (int i = 0; i < nElems; i++) { 
    if (arr[i] > arrayMax) { 
     arrayMax = arr[i]; 
     maxIndex = i; 
    } 
} 

Это было бы гораздо проще, если бы вместо массива, вы должны были использовать ArrayList, в этом случае код будет выглядеть так:

int arrayMax = arr.get(0); 
int maxIndex = 0; 

for (int i = 0; i < nElems; i++) { 
    if (arr[i] > arrayMax) { 
     arrayMax = arr[i]; 
     maxIndex = i; 
    } 
} 
arr.remove(maxIndex); 

В противном случае вам нужно будет создать временный массив, чтобы удалить значение:

int[] temp = new int[arr.length-1]; 
    for(int i = 0, index = 0; index < nElems; i++, index++) 
    { 
     if(index == maxIndex) index++; 
     temp[i] = arr[index]; 
    } 
    arr = temp; 
Смежные вопросы