给定一个长度为 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
中。让我们来分解这行代码:
b[i]
:表示数组 b
中索引为 i
的元素。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、这段代码属于使用双指针的写法。在这个代码片段中,使用了两个指针 i
和 j
分别从数组的两端向中间移动,交换它们指向的元素的值。
双指针是一种常用的算法技巧,特别适用于涉及数组、字符串等数据结构的操作。通过同时从两端移动指针,可以在一次遍历中完成一些特定的任务,如数组的逆序操作、判断回文字符串、查找数组中的两个数等等。
在这段代码中,通过将 i
初始化为起始位置,j
初始化为末尾位置,然后在每次循环中同时增加 i
、减少 j
,并交换 a[i]
和 a[j]
的值,实现了对数组的逆序操作。
2、这段代码的逻辑是使用两个指针 i
和 j
分别指向数组的起始位置和末尾位置,然后在循环中不断将它们向中间靠拢,直到它们相遇为止。因此,当 i
不再小于 j
时循环就会停止。
具体来说,当数组元素个数为偶数时,循环会在 i == j
时停止;当数组元素个数为奇数时,循环会在 i == j + 1
时停止。
这种方法在对数组进行逆序操作时非常高效,因为每一次循环都可以同时处理数组的两个元素,从而节约了时间和空间。