Увеличить длину массива

110
31 марта 2021, 09:10

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

Например, от 4 до 10 элементов:

[a, b, c, d] => [a, a, a, b, b, b, c, c, d, d]

Или такой пример: от 2 до 8 элементов:

[a, b] => [a, a, a, a, b, b, b, b]

Моя попытка - от 4 до 8:

a = [2, 3, 1, 4]; 
b = []; 
 
for(var i = 0; i< a.length;++i){ 
  b.push(a[i]); 
  b.push(a[i]); 
} 
 
a = b; 
 
console.log(a);

Answer 1

Длину нового массива делим на длину исходного. Округляем в меньшую сторону - это будет количество повторений элемента в новом массиве. Если после деления есть остаток, то по единичке повторений разбрасываем на каждый элемент, пока остаток не иссякнет.

Пример реализации, в котором комментариев и "украшательств" больше, чем кода по вопросу:

// Растянуть массив. 
function stretchArray(arr, limit) { 
  if (!arr.length || limit < arr.length) { 
    throw new Error('Не удалось растянуть массив.'); 
  } 
 
  // Целое число, на которое будет размножен каждый элемент. 
  const integer = Math.floor(limit / arr.length); 
 
  // a % b - остаток от деления. 
  // По единичке будем накидывать на каждый элемент. 
  // Кому досталось, тому досталось, как `крошки` со стола. 
  let crumbs = limit % arr.length; 
 
  const newArr = Array.from(arr, function(item, index) { 
    // Сколько раз нужно размножить элемент массива. 
    const repeater = integer + (crumbs > 0 ? 1 : 0); 
 
    // Уменьшаем количество `крошек`. 
    crumbs--; 
 
    // Размножаем элемент массива и возвращаем. 
    return Array(repeater).fill(item); 
  }); 
   
  // [[1, 1], [2, 2]] => [1, 1, 2, 2] 
  return [].concat(...newArr); 
 
  // Можно с помощью `flat`: 
  // return newArr.flat(); 
} 
 
// Исходные данные для примера. 
const first = ['a', 'b']; 
const second = ['a', 'b', 'c']; 
const third = ['a', 'b', 'c', 'd']; 
const fourth = [2, 3, 1, 4]; 
 
// Распечатаем результаты. 
const print = (data) => JSON.stringify(data, null, 2); 
 
pre_first.textContent = print(stretchArray(first, 6)); 
pre_second.textContent = print(stretchArray(second, 8)); 
pre_third.textContent = print(stretchArray(third, 10)); 
pre_fourth.textContent = print(stretchArray(fourth, 23));
pre { 
  display: inline-block; 
  white-space: nowrap; 
  color: #6610f2; 
  background: #eee; 
  border: 1px solid #ccc; 
  border-radius: 2px; 
  padding: 8px 12px; 
}
<h4>6: ['a', 'b']</h4> 
<pre id="pre_first"></pre> 
 
<h4>8: ['a', 'b', 'c']</h4> 
<pre id="pre_second"></pre> 
 
<h4>10: ['a', 'b', 'c', 'd']</h4> 
<pre id="pre_third"></pre> 
 
<h4>23: [2, 3, 1, 4]</h4> 
<pre id="pre_fourth"></pre>

Answer 2

Могу накидать решение на Java) Интерпретируйте в JS. Я думаю суть будет понятна Вам.

public class DynaArray {
    private int[] array;
    private int size;
    public DynaArray() {
        array = new int[10];
    }
    public void add(int element) {
        if (size == array.length) {
            int[] temp = array;
            array = new int[temp.length * 2];
            for (int i = 0; i < temp.length; i++) {
                array[i] = temp[i];
            }
        }
        array[size++] = element;
    }

В строке array = new int[temp.length * 2]; можно указать, на сколько увеличить массив при переполнении.

Answer 3

var arr = ["a", "b"]; 
 
const increase = (arr, length) => { 
  let count = 0; 
  let obj = {}; 
 
  const func = (arr, obj, length) => { 
    arr.forEach(i => { 
      arr.forEach(j => { 
   
        if (i == j) { 
          count++; 
        } 
   
      }); 
   
      obj[i] = count; 
      count = 0; 
    }); 
 
    for (let i = 0; i < arr.length; i++) { 
      let min = Math.min(...Object.values(obj)); 
 
      for (let value in obj) { 
        if (arr.length != length) { 
          if (obj[value] == min) { 
            arr.push(value) 
            obj[value] = min + 1; 
            i = 0; 
          } 
        } else { 
          break; 
        } 
      } 
    } 
 
    arr.sort(); 
 
    return arr; 
  } 
 
  return func(arr, obj, length) 
} 
 
console.log(increase(arr, 5));

Как-то так

READ ALSO
Не меняется css/js на сайте

Не меняется css/js на сайте

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

91
Как компилятор/линкер обходится без объектных файлов для template-классов?

Как компилятор/линкер обходится без объектных файлов для template-классов?

Собственно в этом вопрос, до неприличия простой, но в гугле не нашел ответаКомпилируя в qtcreator'e заметил, что для шаблонных классов нет соответствующих

108
WinAPI. Перенос строки в DrawText

WinAPI. Перенос строки в DrawText

Есть окно, которое выводит конвертированную переменную int в строку, и все это повторяется в цикле (Должно быть 10 строк одной под другой)Код...

128