您的位置:首页 > 其它

MOOC清华《程序设计基础》第5章第1题:判断数列的对称性

2017-07-14 20:36 274 查看
题目描述

给定一个数组,判断其中的数据序列是否左右对称:偶数个数时,左右两半部分正好逆序;奇数时,除中间位置数外,左右逆序
输入格式

第一行N表示一共有N个测试用例,也即接下来的输入数据共有N行。

接下来的每一行表示一个输入数组,第一个数字n表示该数组的元素个数,后面紧跟着n个数,中间都以空格隔开
输出格式

是逆序输出YES,否则输出NO(注意都是大写,小写判错)
样例输入

3
5 1 2 3 2 1
4 1 1 1 2
6 2 1 2 2 1 2

样例输出

YES
NO
YES


#include <iostream>
using namespace std;

int main()
{
int N = 1;
cin >> N;
int *length = new int
; //必须单独存放,这样在数据处理上就化难为易了
int **array = new int *
;

for (int i = 0; i < N; i++)
{
cin >> length[i];
array[i] = new int[length[i]];
for (int j = 0; j < length[i]; j++)
cin >> array[i][j];
}

void Symmetry(int *a, int n);

for(int i = 0; i < N; i++)
Symmetry(array[i], length[i]);

for (int i = 0; i < N; i++)
delete[] array[i]; //注意释放二维数组的技巧,“深度释放内存”
delete[] array;
delete[] length;
return 0;
}

void Symmetry(int *a, int n)
{
int middle, i, j;
if(n % 2 == 0)
{
middle = n / 2;
for(i = 0, j = n - 1; i <= middle - 1 && j >= middle; )
if(a[i] == a[j]) i++, j--;
else
{
cout << "NO" << endl;
break;
}
if(i - j == 1) //这个条件是关键
cout << "YES" << endl;
}
else
{
middle = n / 2;
for(i = 0, j = n - 1; i < middle && j > middle;)
if(a[i] == a[j]) i++, j--;
else
{
cout << "NO" << endl;
break;
}
if(i - j == 0) //这个条件是关键
cout << "YES" << endl;
}
}

测试结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐