2015-08-20 4 views
1

Не могли бы вы помочь мне понять этот алгоритм без использования сращивания:Вставить число А с индексом B

Напишите программу, которая вставляет новый номер A в индексной B. Например, если массив = [1, 3, 5, 7] и A = 10 и B = 2, к концу вашей программы массив должен быть [1, 3, 10, 5, 7].

Мое мышление является то, что я бы цикл через массив, а затем заменить А с Б, но это не совсем верно:

for(var i = 0; i < arr.length; i++) { 
    arr[2] = 10; 
} 
+4

Положительный дубликат http://stackoverflow.com/questions/586182/how-do-i-insert-an-item-into-an-array-at-a-specific-index, что вам нужно, это метод 'сращивание' объекта' Array', проверьте ответ на этот вопрос – higuaro

+0

С использованием или без использования splice()? :) – sinisake

+1

без использования сращивания –

ответ

2

.splice Без использования у вас еще есть довольно много вариантов. Давайте рассмотрим один простой пример.

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

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

function insert (array, index, value) { 
 
    var i = array.length; 
 
    
 
    while (i > index) { 
 
    array[i] = array[--i]; // Prefix is important. 
 
    } 
 
    
 
    array[i] = value; // Or array[index], i === index at this point. 
 
    
 
    return array; 
 
} 
 

 
console.log(insert([1,2,3,4], 2, 'B'));

Это вставляет только один элемент в массив. Вы можете понять, как вставить несколько элементов, начиная с index?


Если вам разрешено использовать .slice и .concat вы можете эмулировать вставки .splice. Это возвращает новый массив.

function insert (array, index, value) { 
 
    return array.slice(0, index).concat(value, array.slice(index)); 
 
} 
 

 
console.log(insert([1,2,3,4], 2, 'B'));

+1

Предположительно, если бы были доступны * slice * и * concat *, то это также * splice *. ;-) – RobG

+0

Это важное замечание. Иногда изгиб правил является частью решения. – Oka

1

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

Использование декремента для цикла:

function slowSplice(array, element, index) { 
    for (var i=array.length; i>index; i--) { 
    array[i] = array[i-1]; 
    } 
    array[index] = element; 
} 

Использование декремента во время цикла:

function slowSplice2(array, element, index) { 
    var i = array.length; 
    while (i > index) { 
    array[i] = array[--i]; 
    } 
    array[index] = element; 
} 

Следует отметить, что выше, предполагает непрерывный массив. Если разреженные массивы должны быть размещены, требуется больше работы. Если функция должна быть реализована как общая функция, следует следовать за splice algorithm from ECMA-262.

Смежные вопросы