#c #arrays #dictionary #vector
Вопрос:
Вот мой код, я использую массив вместо карты, чтобы проверить, повторяется элемент или нет , а затем я добавляю соответствующие значения индексов, в которых присутствует элемент, в вектор, но каждый раз он возвращает 0.
class Solution{
public:
//Function to return the position of the first repeating element.
int firstRepeated(int arr[], int n) {
//code here
vector<int> v(n,0);
int a[1000001]={-1};
for(int i=0;i<n;i )
{
if(a[arr[i]]==-1)
a[arr[i]]=i 1;
v[i]=a[arr[i]];
}
int min=INT_MAX;
for(int i=n-1;i>=0;i--)
{
if(min>v[i] amp;amp; v[i]!=i 1)
min=v[i];
}
if(min!=INT_MAX)
return min;
return -1;
}
};
Помощь будет признательна☺
Комментарии:
1. И когда вы использовали свой отладчик для выполнения вышеуказанной программы, по одной строке за раз, что вы увидели?
2.
int a[1000001]={-1}
инициализирует первый элемент до -1, а остальные до 0. Кроме того, почему в названии вашего вопроса упоминаются карты, когда вы их не используете?3. Отступ вашего первого
if
предполагает группировку кода в стиле Python, которую C не будет соблюдать. Это утверждение if заканчивается на первом;
4. Этот комментарий просто вернул меня к двухмерному мыслительному диалогу в конце «Гнева хана». Решение этой проблемы так же просто.
5.
int a[1000001]={-1};
— Это мгновенно уничтожит память стека, используя настройки Visual C по умолчанию. Почему вы все равно хотите объявить массив такого размера? Ваше желание использовать массив только что привело к тому, что код не смог скомпилироваться-и если он будет скомпилирован, произойдет ошибка переполнения стека. Выбирайте свои контейнеры с умом-выбор массива или, по крайней мере, того, для чего вы планируете его использовать, является неправильным выбором.
Ответ №1:
Одна из первых вещей, на которую следует обратить внимание, — это синтаксис вашего оператора if. В c , если он имеет длину более 1 строки, вы должны инкапсулировать его с помощью {}. Итак, для этого раздела:
if(a[arr[i]]==-1)
a[arr[i]]=i 1;
v[i]=a[arr[i]];
Он всегда будет выполнять v[i] независимо от того, к чему приведет оценка if.
Так
if(some condition){
//lines of code
//another line of code
}
Во-вторых, логика здесь не имеет смысла.
if(a[arr[i]]==-1)
Вы не можете гарантировать, какие числа указаны в arr[]. Что делать, если arr[i] = 1 миллион, то[1 миллион] не существует, так как он имеет длину всего 1000001.
Зачем выбирать значение a, равное 1000001? Это не имеет никакого отношения к размеру arr[] или int n. Следите за тем, чтобы ваши размеры были одинаковыми.
В более общем смысле это сводится к тому, какую информацию вы ожидаете получить в arr[]. Если массив чисел здесь отсортирован или несортирован, это сильно влияет на решение. Если он отсортирован, вам нужно только выполнить цикл и проверить следующее значение:
if(arr[i] == arr[i 1]){
//store value of i for earliest instance of repeat
}
Если он не отсортирован, вам нужно либо сначала отсортировать его, либо проверить весь массив на наличие других повторений, используя что-то вроде вложенного цикла.