Ответы пользователя по тегу Массивы
  • Дубликация значений в массиве. В чем ошибка?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вы модифицируете исходный список, но не делаетe поправку на это.

    Сначала вы берете первый символ и добавляете его на второе место.
    Потом вы берете второй символ, но это не "b", как вы хотели бы, а "a", добавленное на предыдущем шаге. И так далее.

    Вам надо или собирать новый список, или помнить, что вы уже какие-то символы вставили. После i вставок первый недублируемый символ будет на позиции 2*i и вставлять его копию надо на следующую (2i+1) позицию.

    Ну, или идти по списку с конца к началу. Тогда вы будете обращатся к пока неизмененной части.
    Ответ написан
    Комментировать
  • Как обрезать двумерный массив в форме прямоугольника?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Посмотрите описание методов slice и map и попробуйте догадаться, что именно делает приведенный вами код.
    Ответ написан
  • Как вырезать участки из числа и получить остатки?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Отсортируйте точки начала и конца всех отрезков вместе, помеченные с +1 или с -1 в зависимости от стороны.
    Далее есть вот у вас все точки на числовой прямой. Пройдитесь по ним слева направо считая, сколько сейчас открыто отрезков. Если между двумя точками отркрыто 0 отрезков - добавляйте отрезок в ответ.

    Удобный трюк - сдвинуть начала отрезков на 1 влево, чтобы отрезок, вырезающий число 1 (1..1) был длиной 1.
    Представьте, что у вас на числовой прямой 10000 единичных кусочков, с 0 до 10000 - это ваши изначальные числа. Если вы хотите вырезать отрезок 5..7 (числа 5, 6 и 7), то вам надо на этой прямой вырезать отрезок [4...7] - от точки 4 до точки 7.

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

    php не знаю, вот вам на C++. Спрашивайте, если что непонятно:
    vector<pair<int, int>> CutOutSegments(int begin, int end, vector<pair<int, int>> segments)
      // Массив из пар чисел. Пустой массив, в который будем добавлять строки из 2 чисел.
      vector<pair<int, int>> events; 
      events.push_back({begin-1, 1});  // добавляем строку с числами begin и 1.
      events.push_back({end, -1});
      for (auto s: segments) {
         events.push_back({s.first-1, 1});  // s.first - начало отрезка.
         events.push_back({s.second, -1});  // s.second  - конец отрезка.
      }
      sort(events.begin(), events.end());
      int prev_pos = events[0].first;
      int count = 0;
      vector<pair<int, int>> result;
      for (auto e: events) { // e - строка массива events. e.first/second - 2 числа в ней.
        if (prev_pos < e.first && count == 1) {
          result.push_back(prev_pos + 1, e.first); // добавялем +1, что бы отрезок [0, 1] был выдан как одно число 1..1.
        }
        count += e.second;
        if (e.first == end) break;
      }
      return result;
    }


    Возмождно последний цикл можно переписать через reduce, но вряд ли будет короче или читабельнее.
    Ответ написан
    Комментировать
  • Python/numpy: как увеличить массив на одну строку без использования дополнительной памяти?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Нет.

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

    Это даже в C++ сделать нельзя, не говоря уже о питоне.

    Edit: Вообще говоря в C++ есть realloc, Но оно не гарантирует расширение существующей области памяти. Ибо она может быть занята чем-то еще.
    Ответ написан
    1 комментарий
  • Как сравнить два списка ArrayList?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Есть. Складывайте элементы array в HashMap (храните там количетсво каждого элемента).

    Потом пройдитесь по list и, если в HashMap текущий элемент есть с ненулевым счетчиком, выводите другим цветом и уменьшайте счетчик.

    Как выводить в цвете - зависит от языка и платформы. Можно хоть символами "*" ***выделять*** при выводе.
    Ответ написан
    Комментировать
  • Как решить ошибку индексирования динамического двумерного массива?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы работаете с matrix, как если бы это был массив, но у вас это не массив. Или переопределите оператор [] или как-то выдавайте из matrix наружу T**.
    Ответ написан
    Комментировать
  • Как убрать мусор из char массива?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Что у вас за операция пересечения?

    Первая проблема - вы берете максимальную длину двух строк в size и потом проходитесь циклом до size по обеим строкам. Но ведь более короткой строки там просто нет - вы обращаетесь к не вашей памяти.

    Вам надо проверять, есть ли обе строки по индексу i, прежде чем сравнивать их.

    Вторая проблема - вы создаете result размером ровно на количество совпадений, а пишете туда в цикле до size. Т.е. если у вас вообще ни одного совпадения, то массив result будет пустым, но вы там можете хоть 10000-ый элемент записать, если строки достаточно длинные.
    Ответ написан
    Комментировать
  • Как перебрать два массива, и исключить из них дубли, при учете, что дубли могут быть расположены асинхронно?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Можно отсортировать оба массива и потом двумя указателями параллельно по ним пройтись, как при слиянии.

    Или добавьте второй массив в какую-нибудь хеш таблицу и потом пройдитесь по первому массиву проверяя, лежит ли текущий элемент в таблице.
    Ответ написан
    Комментировать
  • Найти позицию элемента в массиве?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    1) Найдите элемент, который встречается наиболее часто. Для этого можно для каждого элемента в массиве подсчитать, сколько раз он встречается вложенным циклом, или лучше воспользоваться каким-нибудь хешмапом для хранения счетчиков. Или отсортировать копию массива и там подсчитать количества вхождений уже очень легко.

    2) Найдите второй с конца элемент. Во-первых, если самый частый встречается всего 1 раз, то ответа нет (-1 по условию). Если он встречается 2 или более раза, то пройдитесь с конца массива и считайте, сколько раз встречали элементы, равные данному. Когда досчитаете до двух - вы нашли ответ.
    Ответ написан
    Комментировать
  • Как найти Среднее арифметическое элементов массива через рекурсию?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Подумайте, как можно рекурсивно считать сумму. Далее, среднее арифметическое элементарно выражается через сумму, а сумма - через среднее арифметическое. Вот и получается формула:

    Avg(a1,a2,...an) = (Avg(a2,...an)*(n-1)+a1)/n
    Ответ написан
    Комментировать
  • Как делать спиральные массивы?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Берете бумажку, рисуете на ней нужный вам спиральный массив. Внимательно на нее смотрите.

    Выписываете прямые куски - какой они длины, в какую сторону вращаются. Ищите паттерн (например в спиральном массиве из центра длины кусков: 1, 1, 2, 2, 3, 3, ...).

    Реализуете его. Внешний цикл работает пока все числа не поставились. Внутри пересчитываете по паттерну длину и направление прямого куска и запускаете цикл от текущей позиции вдоль направления - ставьте числа нужное количество раз.

    Для реализации поворота храните текущее направление в виде двух переменных dx, dy. Одна из них +-1, а другая 0. Для поворота против часовой стрелки делаете (dx, dy) = (-dy, dx)
    Ответ написан
    Комментировать
  • Как сделать реверс масива на С++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Если это задание, то вот в тупую. Читабельно и просто.

    void Reverse (int *a, int x, int y) { 
      int i = y+1;
      int j = x-1;
      while (i < j) {
        int tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
        i++;
        j--;
      }
    }


    Или, если хочется, можно покороче:
    for (int i=x+1, j = y-1; i < j; i++, j--) {
      std::swap(a[i], a[j]);
    }


    Или совсем просто, если это не задание а для дела нужно:
    std::reverse( &a[x+1], &a[y]);

    Только надо обязательно проверить, что x < y - что есть что разворачивать.
    Ответ написан
    1 комментарий
  • Как исправить ошибку в реализации перегруженных функций?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    if (res1 = true)

    Тут вы присваиваете переменной res1 значение true и потом смотрите на ее значение в условии.

    Это вызвано тем, что оператор присврения возвращает значение переменной. Т.е. (res1 = true) == true. Если это вставить в if, то это то же самое что if(true).

    Для сравнения нужно использовать "==".

    Но, вообще говоря, if(res1 == true) - очень плохой код. Правильно писать if (res1).
    Ответ написан
    Комментировать
  • Как преобразовать массив в новый со следующими значениями?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    print ([("small" if a < 20 else "medium") if a <=30 else "large" for a in a_random])
    Ответ написан
  • Как перебрать ходы в двухмерном пространстве?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Можно. Задача решается за O(n^2) динамическим программированием.

    Считайте F(x,y) - лучшую возможную сумму, чтобы закончить в ячейке (x, y).

    База: в левом нижнем углу ответ - число в этой ячейке; за границами - ответ минус бесконечно плохое число (плюс бесконечность, если ищем минимум, например).

    Пересчет F(x,y) = a[x,y] + min(F(x+1,y), F(x,y-1)) - выбираем, с какой стороны выгоднее прийти в эту ячейку.
    Ответ написан
    Комментировать
  • Выдает ошибку IndexError: list index out of range. В чем дело?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    matrix - у вас пустой список, а вы пытаетесь в [i,j]-ую ячейку что-то записать. Ошибка о том и говорит, что идет обращение по недопустимому индексу.

    Вы после ввода m, n сделайте вот это:
    matrix = [[0 for x in range(n)] for y in range(m)]

    А уже потом ваши 2 цикла с генерацией делайте.

    Ну или в циклах добавляйте в matrix новые элементы:
    matrix = []
    for i in range(m):
      matrix.append([])
      for j in range(n):
        matrix[i].append(random.randint(1,9))
    Ответ написан
    2 комментария
  • Swift. При формировании массива добавляется __lldb_expr что это значит?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Я не специалист по свифту, но пока похоже, что язык просто не умеет писать класс Dog. Поэтому выводит какое-то свое внутреннее обозначение класса.
    Ответ написан
    Комментировать
  • Очень странно работает форматирование массива. В чем ошибка?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Внутри for item in array нельзя удалять или добавлять элементы. Итерация слетает.

    Примеров как сделать по-другому много в тут.
    Ответ написан
    Комментировать
  • Python массивы не пашет нужна помощь, что делать?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    У вас массив интов создается:
    massive = array('i', [])

    А пихаете вы туда символ:
    massive.append(random.choice(string.ascii_letters))


    О чем вам интерпретатор и говорит:
    TypeError: an integer is required (got type str)
    Ответ написан
  • Как составить массив из чётных элементов матрицы на Python?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    В заголовке у вас про четные, а в теле задания - плолжительные. Программа как бы ищет четные. Но числа float же, для них четность не имеет смысла. Вам нужно вместо float при вводе приводить к int.

    edit:
    А еще у вас при обходе матрицы только один цикл. А надо так же как при вводе делать двумя вложенными циклами.
    Ответ написан
    Комментировать