#c #arrays
#c #массивы
Вопрос:
Я хочу сравнить два массива. Один из них является подмножеством другого. Я хочу, чтобы моя функция возвращала минимальный и равный разрыв между числами первого подмножества массива в другом массиве.
Например, если у меня есть
arr1 = 2,1,4,2,8,3
sub= 1,2,3
Я хочу, чтобы моя функция возвращала 1, потому что минимальный разрыв между всеми этими числами равен 1.
arr1 = 2,1,5,2,1,2,3
sub= 1,2,3
Я хочу, чтобы моя функция возвращала 0, потому что минимальный разрыв между 1,2,3 в arr1 равен 0
Вот код, который я пытаюсь сделать: Мой код всегда возвращает 0 можете ли вы помочь мне понять, почему и как я могу это решить.
int gap(int* arr, int* sub, int sizeArr, int sizeSub)
{
int index = 0; int gap = 0; bool flag = true;
int i = -1;
for (int jump = 1; jump < sizeArr / sizeSub; jump )
{
index = 0;
for (i = i 1; i < sizeArr; i )
{
if (sub[index] == arr[i])
{
for (int j = i jump, index = 1; j < sizeArr; j = j jump, index )
{
if (arr[j] != sub[index]) { flag = false; break; }
else if (arr[j] == sub[index] amp;amp; index == sizeSub) { flag = true; break; }
}
}
if (!flag) { break; }
else { gap = jump; break; }
}
}
return gap;
}
Комментарии:
1. Поскольку вы пытаетесь найти минимальный скачок, я бы написал код примерно так
int gap(int* arr1, int* sub, int sizearr1, int sizesub) { for (int jump = 1; jump <= sizearr1/sizesub; jump) ...
, т.е. Начните искать скачок первого размера, если вы его не найдете, тогда ищите скачок второго размера и т. Д. Возможно, что-то более сложное было бы более эффективным, но именно с этого я бы начал.2. Я понимаю, что вы хотите, чтобы я делал. Но я понятия не имею, как реализовать это с двумя массивами. И почему ваш цикл до sizearr1 / sizesub
3. Итак, пробел — это самая длинная последовательность чисел, которые не являются частью второго массива? Я бы сказал, что это почти совпадает, но из двух примеров трудно сказать. Кстати: является ли ваш второй массив набором? В этом случае элементы уникальны, и их порядок не имеет значения. В любом случае, что касается вашего фактического вопроса, используйте отладчик для пошагового просмотра кода, чтобы выяснить, где именно он идет не так.
Ответ №1:
Изначально вы взяли gap одинаково 0
, но я думаю, что больше подходит не хранить gap
и начинать итерацию jump
0
. И возвращайте переход сразу после того, как вы обнаружили, что он подходит.
Также я думаю, что хранить индекс таким образом, как вы, это плохая идея, потому что ваш код возвращает неправильный ответ на
int a[] = { 2,1,4,4,2,8,5,3 };
int s[] = { 1,2,3 };
Я думаю, вам следует объявить переменную как можно скорее, иначе возникнут нежелательные побочные эффекты.
Таким образом, ваш код может быть переписан как
int gap(int *arr, int *sub, int sizeArr, int sizeSub)
{
for (int jump = 0; 1 (jump 1) * (sizeSub - 1) <= sizeArr; jump ) {
for (int start_index = 0; start_index (jump 1) * (sizeSub - 1) < sizeArr; start_index ) {
bool flag = true;
for (int index = 0; index < sizeSub; index) {
if (arr[start_index index * (jump 1)] != sub[index]) {
flag = false;
break;
}
}
if (flag) {
return jump;
}
}
}
return -1; //or some value that indicate that there is no answer
}
Комментарии:
1. Спасибо вам. Можете ли вы объяснить, какова ваша логика в коде и что делает ваш вложенный цикл, и что это значит 1 (jump 1) * (sizeSub — 1) <= sizeArr
2. Сначала я перебираю переход, когда пытаюсь найти позицию, в которой подмассив появляется в массиве с учетом пробелов, поэтому в
int a[] = { 2,8,1,4,2,5,3 }; int s[] = { 1,2,3 };
начальной позиции, когдаjump=1
равно 2. И третий цикл проверяет, действительно ли подмножество отображается в этой позиции.1 (jump 1) * (sizeSub - 1) <= sizeArr
проверяет, что, по крайней мере, теоретически мы можем поместить наш подмассив в массив сgap=jump