函数基础题:数组翻转

给定一个长度为 n 的数组 a和一个整数 size,请你编写一个函数,void reverse(int a[], int size),实现将数组 a中的前 size 个数翻转。

输出翻转后的数组 a。

输入格式

第一行包含两个整数 n和 size。

第二行包含 n 个整数,表示数组 a。

输出格式

共一行,包含 n 个整数,表示翻转后的数组 a。

数据范围

1≤size≤n≤1000,
1≤a[i]≤1000

输入样例:
5 3
1 2 3 4 5
输出样例:
3 2 1 4 5

  

#include 

using namespace std;
const int N = 1010;
int b[N];
void reverse(int a[], int size)
{

  for (int i = 0; i < size; i++)
  {
    b[i] = a[size - 1 - i];
  }
}/*定义了一个常量 N 和一个大小为 N 的整型数组 b,同时声明了一个函数 reverse,该函数用于将传入的数组逆序存储到数组 b 中。*/

int main()
{
  int n, size;
  cin >> n >> size;/*声明了两个整型变量 n 和 size,并从标准输入流中读取两个数值,分别赋给 n 和 size。*/

  int a[N];

  for (int i = 0; i < n; i++)
    cin >> a[i];
  reverse(a, size);

  for (int i = 0; i < size; i++)
  {
    a[i] = b[i];
  }//将数组 b 中的前 size 个元素复制回数组 a 中,实现了对数组的部分逆序操作。

  for (int i = 0; i < n; i++)
    cout << a[i] << ' ';

  return 0;
}

其中一些语句的含义:

b[i] = a[size - 1 - i];

这段代码表示将数组 a 中的元素逆序存储到数组 b 中。让我们来分解这行代码:

  1. b[i]:表示数组 b 中索引为 i 的元素。
  2. a[size - 1 - i]:表示数组 a 中索引为 size - 1 - i 的元素,其中 size 是数组 a 的大小。

因此,整行代码的含义是将数组 a 中的倒数第 i+1 个元素(即 size - 1 - i 索引处的元素)赋值给数组 b 中的第 i 个位置。通过循环执行此操作,可以将数组 a 中的元素逆序存储到数组 b 中。

举个例子,如果数组 a 中的元素依次为 [1, 2, 3, 4, 5],并且 size 为 5,那么经过上述操作,数组 b 中的元素将变为 [5, 4, 3, 2, 1]

这种操作常用于需要逆序处理数组中元素的场景,例如反转字符串、反转数组等。

第二种写法:双指针的写法

#include 

using namespace std;

void reverse(int a[], int size)
{
    for (int i = 0, j = size - 1; i < j; i ++, j -- )
        swap(a[i], a[j]);
}

int main()
{
    int a[1000];
    int n, size;

    cin >> n >> size;
    for (int i = 0; i < n; i ++ ) cin >> a[i];
    reverse(a, size);

    for (int i = 0; i < n; i ++ ) cout << a[i] << ' ';

    return 0;
}

 上面代码的解析:

1、这段代码属于使用双指针的写法。在这个代码片段中,使用了两个指针 ij 分别从数组的两端向中间移动,交换它们指向的元素的值。

双指针是一种常用的算法技巧,特别适用于涉及数组、字符串等数据结构的操作。通过同时从两端移动指针,可以在一次遍历中完成一些特定的任务,如数组的逆序操作、判断回文字符串、查找数组中的两个数等等。

在这段代码中,通过将 i 初始化为起始位置,j 初始化为末尾位置,然后在每次循环中同时增加 i、减少 j,并交换 a[i]a[j] 的值,实现了对数组的逆序操作。

2、这段代码的逻辑是使用两个指针 ij 分别指向数组的起始位置和末尾位置,然后在循环中不断将它们向中间靠拢,直到它们相遇为止。因此,当 i 不再小于 j 时循环就会停止。

具体来说,当数组元素个数为偶数时,循环会在 i == j 时停止;当数组元素个数为奇数时,循环会在 i == j + 1 时停止。

这种方法在对数组进行逆序操作时非常高效,因为每一次循环都可以同时处理数组的两个元素,从而节约了时间和空间。

 

你可能感兴趣的:(算法,数据结构)