Я застрял в одном вопросе на вопрос.. Вопрос в том,
*, учитывая два массива A и B. A имеет целые числа, несортированные. B имеет тот же длина как A и ее значения находятся в set {-1,0,1}
вам нужно вернуть массив C с помощью после обработки на A.
если B [i] имеет 0, то C [i] должно иметь A [i]
если B [i] имеет -1, то A [i] должно быть в C в пределах подмножества C [0] - C [i-1], т.е. левый подрамник
если B [i] имеет 1, то A [i] должен быть в C в подвале C [i + 1] - C [длина (A)], т.е. справа подмассив.если такое решение не существует, тогда printf ( "no solution" ); *
Я применил следующие логики: -
int indMinus1 = n-1;
int indPlus1 = 0;
//while(indPlus1 < n && indMinus1 > 0)
while(indPlus1 < indMinus1)
{
while(b[indMinus1] != -1) {
if(b[indMinus1] == 0)
c[indMinus1] = a[indMinus1];
indMinus1--;
}
while(b[indPlus1] != +1) {
if(b[indPlus1] == 0)
c[indPlus1] = a[indPlus1];
indPlus1++;
}
c[indMinus1] = a[indPlus1];
c[indPlus1] = a[indMinus1];
b[indMinus1] = 0;
b[indPlus1] = 0;
indMinus1--;
indPlus1++;
}
Но это не сработает, для некоторых случаев, таких как {1,2,3} → {1, -1, -1}... возможен один выход, т.е. {2,3,1};
Пожалуйста, помогите.... использует ли их какой-либо алгоритм для этой проблемы?
Правильный код решения
int arrange(int a[], int b[], int c[], int n)
{
for (int i = 0; i < n; ++i) {
if(b[i] == 0)
c[i] = a[i];
}
int ci = 0;
for (int i = 0; i < n; ++i) {
if(b[i] == -1) {
while(c[ci] != 0 && ci < i)
ci ++;
if(c[ci] != 0 || ci >= i)
return -1;
c[ci] = a[i];
ci++;
}
}
for (int i = 0; i < n; ++i) {
if(b[i] == 1) {
while(c[ci] != 0 && ci < n)
ci ++;
if(c[ci] != 0 || ci <= i)
return -1;
c[ci] = a[i];
ci++;
}
}
return 0;
}