Замена двух чисел без использования лишних пробелов не работает, если оба указывают на одно и то же место? [Дубликат]

0

Недавно я столкнулся с этим вопросом написать функцию для замены двух чисел без использования дополнительного пространства. Функция может быть двумя способами:

int swap ( int *a, int* b)
{
    *a = *a+*b;
    *b = *a-*b;
    *a = *a-*b;
}

Другим способом является операция XOR:

int swap ( int *a, int* b)
{
    *a = *a^*b;
    *b = *a^*b;
    *a = *a^*b;
}

Несмотря на то, что обе эти функции являются хорошей идеей, они не будут работать, если оба а и b указывают на одну ячейку памяти? Как справиться с этим?

  • 7
    if (a != b) ??
  • 1
    Это особый случай, и обычно люди справляются с этим, как особый случай.
Показать ещё 13 комментариев
Теги:

4 ответа

5
Лучший ответ

Проблема очевидна в математике.

int swap ( int *a, int* b)
{
    *a = *a+*b;
    *b = *a-*b;
    *a = *a-*b;
}

когда a и b указывают на то же место, тогда код выше превращается в

*a = *a + *a; // *a = 2 x (*a)
*b = *a - *a; // = 0
*a = *a - *a; // = 0

Итак, оба *a и *b равны нулю. Для этого вы должны обращаться с помощью if:

int swap ( int *a, int* b)
{
    if (a!=b)
    {
      *a = *a+*b;
      *b = *a-*b;
      *a = *a-*b;
    }
}

И то же самое для версии xor.

2
#define SWAP(a, b) (((a) == (b)) || (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))))
  • 0
    Я надеюсь, что те a и b не оригинальные указатели.
  • 0
    Верный. Я был ленивым. :-П
1

Почему бы кто-нибудь обменять два числа, не используя лишнее пространство?

Какой садист даст вам достаточно места для двух, но не трех?

Почему вы так называете это "космос"? Это всего лишь третье число, нет необходимости ссылаться на огромное, заполненное вакуумом место.

Алгоритм, использующий временное использование O (1) пространства в количестве операций свопинга. Это O (n) в длине числа, но вполне возможно, что бит-twiddling и арифметические придают процессор-недружественный n.

Если у вас недостаточно места для простого номера, вы просто исчерпали пространство. Я не могу видеть, где вы можете перейти от свопа в этом случае.

Почему бы не сохранить эти два номера в их собственных местах в первую очередь?

0

Вы можете попробовать это, а = а + Ь; B = A-B; а = а-б;

  • 0
    Вы читали вопрос

Ещё вопросы

Сообщество Overcoder
Наверх
Меню