Задать вопрос
Ответы пользователя по тегу Массивы
  • Как считать числа из текстового файла в массив на с++?

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

    Читайте циклом while, пока чтение не вернет ошибку:
    int x;
    ifstream f("file.txt");
    while (f >> x) {
      v.push_back(x);
    }
    Ответ написан
    5 комментариев
  • Как в C++ создать массив с неизвестным числом элементов?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Можно через new[] выделить массив:
    cin >> n;
    int *array = new int[n];
    // ввод, и работа с массивом.
    
    // не забудьте в конце удалить выделенную память.
    delete[] array;
    Ответ написан
  • Выдает ошибку, как ее можно исправить?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Индексы в сравнении напутаны. Вы делаете один проход пузырька (как бы полусортировка) поочередно по возрастанию каждого столбца. Вместо того, чтобы сделать все проходы сравнивая один и тот же 0-ой столбец.
    Ответ написан
    Комментировать
  • Как лучше развернуть двумерный массив?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Если не обязательно делать поворт на месте, то вся суть алгоритма вот в этой одной строке:
    result[i][j] = arr[n-1-j][i];
    Надо только циклы прогнать по нужным границам, да массив нужного размера создать.

    Если матрица квадратная, то элементы сдвигаются по кругу в четверках - и это можно сделать без дополнительного массива . Можно делать сдвиг по кругу со временной переменной. Что-то вроде этого:
    tmp = arr[i][j];
    arr[i][j] = arr[n-1-j][i];
    arr[n-1-j][i] = arr[n-1-i][n-1-j];
    arr[n-1-i][n-1-j] = arr[j][n-1-i];
    arr[j][n-1-i] = tmp;


    И надо аккуратно границы цикла подобрать, чтобы там только левый верхний угол обработался. Иначе вы 4 раза в каждом круге сдвините, и ничего не поменяется.
    Ответ написан
    Комментировать
  • Почему непопулярен динамический многомерный массив?

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

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

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    pd.options.display.max_rows = 1000 перед выводом.
    Ответ написан
    3 комментария
  • Как перемешать между собой слова создав новые?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Т.е. вам надо сгенерировать перестановку заданных слов? Ну без разницы же, что перемешивать: числа или слова.
    Получите массив из ваших слов, разбив строку по пробелам. Потом перемешайте массив стандартным алгоритмом. Потом выведите их через пробел.

    Стандартный алгоритм перемешивания таков:
    for i in range(len(a)):
      j = random.randint(0, i);
      a[i], a[j] = a[j], a[i]


    Тут поддерживается инвариант, что первые i элементов равномерно и случайно перемешаны. На каждой итерации выбирается случайная позиция для нового элемента (возможно последняя и элемент никуда не переместится). Дальше достаточно только лишь поменять новый элемент со стоящим на его месте. Ведь по инварианту все остальные элементы уже случайно перемешаны и в итоге случайно перемешанными оказываются N+1 элементов.
    Ответ написан
  • Как сравнить группу элементов в одномерном массиве в с++?

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

    1) Проверить, что данный элемент надо удалить
    1.1) Проверить, что элемент не уникальный
    1.2) Проверить, что элемент - не первый среди одинаковых (один-то его надо оставить)
    2) Удалить элемент из массива дописав 0 в конце.

    Все эти пункты выполняются циклом. в первых пунктах будет удобно завести булевую переменную, которая после цикла будет содержать значение проверки.
    Ответ написан
    Комментировать
  • Как в php сравнить два огромных txt файла до 100гб, удалив дубликаты?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Файлы надо отсортировать. А потом это стандартная задача слияния отсортированных списков (читаете по одной строке из файла, меньшую по алфавитному порядку записываете в ответ, читаете из ее файла следующую строку. Если 2 строки одинаковые - читайте следующую строку в каждом файле. Если файл закончился, считайте что там бесконечно большая лексикографически строка).

    Сортировка очень больших файлов - тоже стандартная тема. Лучше всего, наверно, подойдет radix sort. Правда, нужно будет свободного места на диске чтобы копии файлов тоже помещались, да лучше с запасом. Тут надо будет 3 раза (или какая там у вас длина строки) прочитать файл. Прочитанные строки надо распихивать по 256 (или сколько там символов различных может быть) файлам. Потом все эти файлы надо собрать воедино в нужном порядке.

    Надо только хорошо порыться в документации - нужны функции php которые читают файл построчно и не грузят его весь целиком в память. Если, конечно, у вас не ~128гб оперативки. Тогда лучше каждый файл загрузить в память целиком и сортировать quick sort'ом.
    Ответ написан
    Комментировать
  • Массив. выделение памяти. ошибка сегментирования. но почему?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Во-первых, код надо вставлять текстом, через кнопку </> в редакторе.
    Во-вторых, пройдитесь вы дебаггером.

    Проблема ошибок работы с памтью, что результат непредсказуем. Программа может упасть во время попытки что-то не то сделать с массивом, отработать неправильно, вывести неверный ответ в конце, упасть при завершении программы. Это зависит от тысячи факторов: что как компилятор расположил в машинном коде, как он решил использовать регистры... Поэтому даже перестановка слагаемых местами может влиять на результат в неправильной программе. Это и есть тот самый знаменитый Undefined Behavior.

    В вашем случае arr[i] + abs(min), очевидно, может запрасто выйти за границы 0.. temp_arr_length-1.
    Ответ написан
    Комментировать
  • Как задать условие для цикла?

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

    Но можно проще. Считайте вообще все последовательности нулей. до какой-то пары (это значит сейчас 0 - а следующаяя ячейка не ноль.). Но так посчитаются недо-окна перед первыми парами. Вы можете эти недо-окна подсчитать. Это просто те дни, в которых в начале стоит 0. Но тут, вы правильно заметили, проблема. День в котором одни нули посчитается недо-окном и вычтется, но ничего к ответу не прибавит. Поэтому вам надо отдельно прибавить количество дней из одних только нулей.
    Ответ написан
    Комментировать
  • Сдвиг двумерного массива, появление ошибки Stack around the variable 'arr' was corrupted. Как исправить без переписывания кода?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Код исправляется элементарно. Надо внутренний цикл по j гнать не до 0, а до 1. Что бы не вылезать за границу массива, вы же там к j-1 -ому элементу обращаетесь. А поскольку вы делаете swap, то вы меняете элементы массива с памятью перед ним. Массив - локальная переменая, а значит он лежит на стеке и вот это вот затирание памяти рядом с массивом и есть это самое "Stack around the variable 'arr' was corrupted".

    Ну и по стилю - вместо i > -1 обычно пишут i >= 0.
    Ответ написан
    Комментировать
  • Как сделать чтобы нейросеть поняла входные данные?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вы сети скармливаете какие-то 2 картинки. У нее 2 input'а

    print(model.predict([image,image2]))

    Втавьте вот в этот код выше перед вызовом predict вывод размеров image и image2.

    Сдается мне, что вы одну картинку как-то на 2 куска порезали и так и скормили сети. Если это не ваш код, то он возможно ожидает на вход картинку 128x64.
    Ответ написан
  • Можно ли изменить массив (объединить слова в нём) до и после определенного слова?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Можно. Для этого можно, например, пройтись циклом по словам формируя список-ответ. Если текущее слово не содержит символ параграфа, то его надо или добавить к списку ответа, или добавить к последнему слову там. Или проще может быть поддерживать переменную с текущим объединением слов. Если слово в списке не соедржит парагафа - добавляйте к переменной. Если встретили прагараф, то добавляйте в ответ переменную и слово с параграфом и отчищайте переменную.
    Ответ написан
    Комментировать
  • Почему неправильно выводит максимальное число?

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

    Можете строчка за строчкой объяснить, что происходит в коде? Я начал, вы дополните в остальных строчках. Сразу должно стать понятно, где ошибка в логике:

    numbers = input().split()               # получаем в numbers массив из отдельных слов в введенной строке
    flag = 0                                # инициализируем счетчик нулем
    for i in range(len(numbers)):           # проходимся по всей длине массива (по всем словам)
        if numbers[i].isdigit() == True:    # Если текущее слово состоит только из цифр (т.е. оно число)
            flag += 1                       # Увеличиваем счетчик
    if flag == len(numbers):                # если все слова в строке - числа
        for i in range(len(numbers)-1):     # ???
            print(numbers[i], numbers[i+1]) # ???
            if numbers[i] < numbers[i+1]:   # ???
                mx = numbers[i+1]           # ???
    print(mx)
    Ответ написан
  • Перебрать все комбинации массивов строк?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Рекурсивная функция должна принимать текущий набор строк и номер следующего массива. Функция циклом перебирает строку из следующего массива, добавляет эту строку к текущему набору и вызывается рекурсивно. После вызова последнюю строку надо из текущего набора удалить. Если в начале функции вы видите, что обработаны уже все массивы - выводите текущий набор в ответ и возвращайтесь из функции.

    Еще, естественно, надо передавать в функцию массив массивов строк - ваши исходные данные.
    Ответ написан
    Комментировать
  • Трёхмерный массив с разными размерами внутренних массивов?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Используйте vector<vector<vector<int>>>> - каждая строка/столбец могут быть любого нужного вам размера.

    Еще можно хранить ваши массивы как указатели в одном массиве указателей. Ведь эти сишные массивы - это по сути и есть указатели на начало. Вот только в таком виде вам придется как-то где-то помнить их размеры и вручную высчитывать индексацию в виде a[i*6+j], b[i*7+j].
    Ответ написан
    1 комментарий
  • Как соединить в пары элементы двумерного массива?

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

    А дальше можно через np.asarray и map преобразовать массив touples в массив массивов.
    Ответ написан
  • Как работают пермутации (arrays)?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Это рекурсивный метод генерации всех перестановок. Сначала рекурсивно генерируется перестановки для всех символов, кроме первого. Потом к каждой перестановке в каждую возможную позицию вставляется первый символ.

    Так, для генерации всех перестановок "abc", сначала рекурсивно будет получен массив {"bc", "cb"}, потом для каждого его элемента в ответ будет добавлена перестановка с "a" вставленным в позицию 0, 1 и 2: "abc", "bac", "bca" для первого элемента, и "acb", "cab" и "cba" для второго.

    Или вам не понятно, что делают reduce, slice, substring, concat, join?
    Ответ написан
    Комментировать
  • Как определить, можно ли из символов первого массива создать строку идентичную второму массиву?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Подсчитайте, сколько каждого символа встречается в первой строке и убедитесь, что во второй - их не больше.
    Самый простой способ сделать это - это завести массив счетчиков на 256 элементов. Для символов первой строки увеличивайте счетчик по индексу static_cast<int>(s[i]) на 1, для второй строки - вычитайте 1. Если где-то получили -1, то составить нельзя.

    И еще, это же у вас C++, судя по тегам и cin? Ну так используйте std::string. Зачем вы сишные строки выделяете?
    Ответ написан
    Комментировать