如何仅用一位切换数组中的两位?

时间:2019-05-15 18:52:34

标签: c

操作方法:

数组1:2 8 5 7 3 5
阵列2:2018 5 7 3 5

问题是,如果两个偶数在第一个数组中连续,则将2018放在其位置,就像这样。 我该怎么办?

for(a=n-1; a>=0; a--)
{
    if( b[a]%2==0 && b[a-1]%2==0)
    {
        for(c=a-1; c<n-1; c++)
        {
            b[c]=b[c+1];
        }
        b[a]= 2017;
    }

}

2 个答案:

答案 0 :(得分:1)

您不能真正更改数组的大小,但是可以移动元素并在最后忽略元素:

#include <stdio.h>

void shift_left(int* arr, size_t sz, size_t shift_cnt)
{
  for (size_t i = 0; i != sz - shift_cnt; ++i)
  {
    arr[i] = arr[i + shift_cnt];
  }
  for (size_t i = sz - shift_cnt; i != sz; ++i)
  {
    arr[i] = 0;
  }
}

int main()
{
  int arr[] = { 2, 8, 5, 7, 3, 5 };
  size_t sz = sizeof(arr) / sizeof(arr[0]);

  for (size_t i = 0; i < sz - 1;)
  {
    if (arr[i] % 2 == 0 && arr[i + 1] % 2 == 0)
    {
      shift_left(arr + i, sz-- - i, 1);
      arr[i] = 2018;
    }
    else
    {
      ++i;
    }
  }

  for (size_t i = 0; i != sz; ++i)
    printf("%d ", arr[i]);

  return 0;
}

// Output: 2018 5 7 3 5

答案 1 :(得分:0)

让源数组向下搜索以寻找偶数对

// return size used

size_t AJ_squish(int *dest, size_t dest_size, const int *src, size_t src_size) {
  size_t dest_len = 0;
  while (src_size > 1 && dest_len < dest_size) {
    // 2 evens in a row?
    if (src[0] % 2 == 0 && src[1] % 2 == 0) {
      dest[dest_len++] = 2018;
      src_size -= 2;
    } else {
      dest[dest_len++] = *src++;
      src_size--;
    }
  }
  if (src_size >  0 && dest_len < dest_size) {
    dest[dest_len++] = *src;
  }
  return dest_len;
}