如何精简C++中检查6元素数组回文子数组的重复循环?
问题描述
需要统计一个含6个元素的数组中的回文子数组数量,目前用7个逻辑相似的for循环实现了功能,但代码冗余严重,希望精简循环优化结构。
原实现代码:
int main() { int size = 6; int array[size]; int palCount = 0; for (int i = 0; i < size; i++) { cin >> array[i]; } bool isPal = true; int size2 = 2; for (int i = 1; i <= 6; i++) { int currentNum = array[i]; int numAfter = array[i + 1]; int arrToCheck[] = {currentNum, numAfter}; isPal = checkPalindrom(arrToCheck, size2); if (isPal) { palCount++; } } int size3 = 3; for (int i = 1; i <= 6; i++) { int currentNum = array[i]; int numAfter = array[i + 1]; int numAfter2 = array[i + 2]; int arrToCheck[] = {currentNum, numAfter, numAfter2}; isPal = checkPalindrom(arrToCheck, size3); if (isPal) { palCount++; } } int size4 = 4; for (int i = 1; i <= 6; i++) { int currentNum = array[i]; int numAfter = array[i + 1]; int numAfter2 = array[i + 2]; int numAfter3 = array[i + 3]; int arrToCheck[] = {currentNum, numAfter, numAfter2, numAfter3}; isPal = checkPalindrom(arrToCheck, size4); if (isPal) { palCount++; } } int size5 = 5; for (int i = 1; i <= 6; i++) { int currentNum = array[i]; int numAfter = array[i + 1]; int numAfter2 = array[i + 2]; int numAfter3 = array[i + 3]; int numAfter4 = array[i + 4]; int arrToCheck[] = {currentNum, numAfter, numAfter2, numAfter3, numAfter4}; isPal = checkPalindrom(arrToCheck, size5); if (isPal) { palCount++; } } //================================================================ for (int i = 2; i <= 6; i++) { int currentNum = array[i]; int numAfter = array[i + 1]; int arrToCheck[] = {currentNum, numAfter}; isPal = checkPalindrom(arrToCheck, size2); if (isPal) { palCount++; } } for (int i = 2; i <= 6; i++) { int currentNum = array[i]; int numAfter = array[i + 1]; int numAfter2 = array[i + 2]; int arrToCheck[] = {currentNum, numAfter, numAfter2}; isPal = checkPalindrom(arrToCheck, size3); if (isPal) { palCount++; } } for (int i = 2; i <= 6; i++) { int currentNum = array[i]; int numAfter = array[i + 1]; int numAfter2 = array[i + 2]; int numAfter3 = array[i + 3]; int arrToCheck[] = {currentNum, numAfter, numAfter2, numAfter3}; isPal = checkPalindrom(arrToCheck, size4); if (isPal) { palCount++; } } cout << palCount - 1 << endl; }
回文检查函数:
bool checkPalindrom(int arr[], int sizeOfArray) { int size = sizeOfArray; bool pal = true; for (int i = 0; i < size / 2; i++) { if (arr[i] != arr[size - 1 - i]) { pal = false; } } return pal; }
预期输入输出:
- 输入:
1 1 1 1 1 1,输出:15 - 输入:
1 2 2 1 5 5,输出:3
优化思路与实现
1. 修复原代码索引Bug
原代码数组索引从1开始且循环条件i <=6会导致数组越界(数组实际索引范围为0-5),优化时首先修正该逻辑。
2. 嵌套循环遍历所有合法子数组
子数组的核心属性是起始索引和长度,用两层循环即可覆盖所有情况:
- 外层循环:遍历子数组长度
len,范围从2到6(对应题目统计的回文子数组长度) - 内层循环:遍历子数组起始索引
start,保证start + len <= 6,避免越界
3. 优化回文检查逻辑
无需每次创建新数组传递给检查函数,直接传入原数组的起始索引和子数组长度,减少不必要的内存拷贝,同时在检查到不相等元素时直接退出循环,提升效率。
优化后的完整代码
#include <iostream> using namespace std; bool checkPalindrom(int arr[], int start, int len) { bool pal = true; for (int i = 0; i < len / 2; i++) { int left = start + i; int right = start + len - 1 - i; if (arr[left] != arr[right]) { pal = false; break; } } return pal; } int main() { const int size = 6; int array[size]; int palCount = 0; // 读取输入数组 for (int i = 0; i < size; i++) { cin >> array[i]; } // 遍历所有长度≥2的子数组 for (int len = 2; len <= size; len++) { for (int start = 0; start + len <= size; start++) { if (checkPalindrom(array, start, len)) { palCount++; } } } cout << palCount << endl; return 0; }
验证预期输入
- 输入
1 1 1 1 1 1:所有长度2-6的子数组均为回文,数量为5+4+3+2+1=15,输出符合预期。 - 输入
1 2 2 1 5 5:符合条件的回文子数组为[2,2]、[1,2,2,1]、[5,5],共3个,输出符合预期。
内容的提问来源于stack exchange,提问作者Milad
相关产品推荐
相关产品推荐

