You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何精简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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:35:25