не могу найти ошибку в моей прикладной логике

вопрос:
Учитывая массив элементов длины N в диапазоне от 0 до N-1, ваша задача — написать программу, которая переставляет элементы массива. Все элементы могут отсутствовать в массиве, если элемент отсутствует, то в массиве будет присутствовать -1. Переставьте массив так, чтобы A [i] = i, а если i нет, отобразите -1 в этом месте.

мой код:

#include <iostream>
using namespace std;

int main()
{
long  int n;
cin>>n;
long  int a[n];
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for (int i=1;i<=n;i++)
{while(a[i]==i&&a[i]==-1)
{
int temp=a[i];
a[i]=a[temp];
a[temp]=temp;
}}

for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
return 1;

}

выход:

6
-1 4 2 3 -1 5
-1 4 2 3 -1 5

Может ли кто-нибудь, пожалуйста, помогите мне узнать мою ошибку в логике?
Заранее спасибо.

-5

Решение

for(int i=1;i<=n;i++)

Неправильно, элементы идут от 0 до N-1, а не от 1 до N

while(a[i]==i&&a[i]==-1)

Этого никогда не произойдет, вы просите, чтобы [i] было равно и i, и -1, что означает, что i должно быть равно -1, что не произойдет в вашем цикле.

Для простого ответа вам нужно отсортировать список, а затем обработать его. Для эффективного ответа вы захотите создать логический массив размера N, а затем выполнить итерацию массива и проверить, какие значения присутствуют. Затем вы перебираете логический массив, чтобы записать число, когда оно присутствует, или -1, если его нет.

1

Другие решения

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

Поскольку карты начинаются с 1, а не с 0, я использую 10 как 0. Используйте джокер, чтобы указать пустой пробел (-1 в описании вашей проблемы).

Возьмите пять карт и выложите их в шесть мест

2  10  4  J  3  1

Начиная с позиции 0. Вытяните 2 и замените его на -1, чтобы ваши карты выглядели так:

J  10  4  J  3  1

И вы держите 2 в руке.

Затем перейдите в положение 2, вытащите 4 и поместите туда 2. Теперь у вас есть

J  10  2  J  3  1

И вы держите 4 в руке. Перейдите в положение 4 (где 3). Замените 3 на 4, у вас есть:

J  10  2  J  4  1

И 3 в руке. Позиция 3 содержит джокер. Таким образом, вы положили 3 в эту позицию и отложили джокера в сторону. Теперь у вас есть:

J  10  2  3  4  1

Итак, вы переходите на следующую позицию: 1. Возьмите 10 и поместите джокера в это место. 10 переходит в позицию 0, поэтому возьмите джокера из позиции 0, поместите туда 10, и вы получите:

10  J  2  3  4  1

Теперь у вас ничего нет, поэтому вы двигаетесь вперед, проверяя позиции 2, 3 и 4, у которых уже есть [i] == i. Но позиция 5 содержит 1. Таким образом, вы поднимаете ее, помещаете джокера в эту позицию, а затем заменяете джокера в позиции 1 значением 1, которое вы только что вытащили из позиции 5. Теперь ваш массив выглядит так:

10  1  2  3  4  J

И вы сделали.

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

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

0

По вопросам рекламы [email protected]