Member 12794987 Ответов: 1

Как отправить дублированные элементы в конец массива?


Я должен найти все дубликаты элементов в заданном массиве и отправить их в конце с их первоначальным порядком.
Например:
Вход: 2 3 2 4 5 4 3 7 1 2 6
Выход: 2 3 4 5 7 1 6 2 4 3 2
В моем вопросе размер уже определен(11), но это все равно не проблема.

Я решаю эту проблему, но получаю такую ошибку:

"Ошибка проверки времени выполнения #2-стек вокруг переменной' a ' был поврежден."

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

Что я уже пробовал:

MY Code is:

#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
#define SZ 11
int main()
{
	
	ifstream fs("C:\\Users\\Can\\Desktop\\file.txt");
	if (!fs)
		return 0;
	int a[SZ];
	for (int i = 0; i < SZ; ++i)
		fs >> a[i];
	
	int b, c, d;

	for (b = 0; b < SZ; b++)
	{
		for (c = b + 1; c < SZ; c++)
		{
			if (a[b] == a[c])
			{
				for (d = c; d < SZ; d++) {
					int temp = a[b];
					a[d] = a[d + 1];
					a[SZ-1] = temp;
				}
			}
		}
	}

	for (int i = 0; i < SZ; ++i)
		cout << a[i] << " ";

	return 1;
}

With this code I get output: 2 3 4 5 7 1 2 3 4 2 2

If I change "a[SZ -1] = temp" to "a[SZ] = temp" I get the right output but also an error.

Please help me find the mistakes in my code.
Also forget about the file, just think it as a given input above.

1 Ответов

Рейтинг:
6

OriginalGriff

Первое, что следует отметить, это то, что вы не хотите делать это "на месте" - вам действительно нужен отдельный выходной массив для загрузки ваших данных. Если вы попытаетесь сделать это в том же массиве, вы получите проблемы с некоторыми случаями.
Поэтому создайте второй массив и запустите его через входные данные.
Начните с запуска трех индексов или указателей: In, Out, Temp: более поздний старт в том же месте, что и In.
Затем петля:
Если значение на В не в выходной, скопировать его туда, и оттуда
Если это так, скопируйте его в Temp и inc Temp.
Inc In.
Когда это будет закончено, скопируйте все значения, которые вы скопировали в Temp to Out.

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


Member 12794987

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

OriginalGriff

Если вы не можете использовать дополнительные массивы, то вам придется быть осторожным.
Ты можешь это сделать:
Если поставить это 122334
Затем вам нужно удалить дубликат, сохранить его и переместить все остальные вниз:
122334
122334
123342
123342
123423
Поэтому напишите функцию, которая принимает массив и индекс и" перетасовывает " все символы справа от индекса (если вы думаете о нем как о отдельном массиве, то его легко написать и легко протестировать изолированно).
Напишите еще одну функцию, которая проверяет, есть ли там уже значение, и возвращает значение "true / false", а основной код вокруг них становится простым циклом и намного понятнее.
И сделайте себе одолжение: перестаньте использовать имена одного персонажа! Ваш код намного легче читать, если ваши индексы имеют имена типа "currentValue" вместо "b", а дополнительная типизация в современной IDE тривиальна.

Member 12794987

Огромное спасибо :) Я подумаю над вашим советом. Надеюсь, я смогу выбраться отсюда целым и невредимым!

OriginalGriff

Ты доберешься туда!

Member 12794987

Что ж мне это удалось :) Отличается и немного сложнее, чем то, что вы предложили, но, по крайней мере, это работает :) Я могу поделиться им через личное сообщение, если вы хотите проверить :)

OriginalGriff

Я не твой учитель - я не обязан это проверять! :смеяться:
Я рад, что у тебя получилось. :большой палец вверх: