Неверный вывод при использовании приложения stl map в массивах

#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
}
 

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