如何识别数字数组中的嵌入回文

How to identify an embedded palindrome within an array of digits

假设我们有

int arr1[]={1,2,3,4,5};
int temp1[], temp2[];

并且我们需要将前 3 个成员从 arr1 复制到 temp1,然后将第二个 3 从 arr1 复制到 temp2,这样

temp1={1,2,3};
temp2={2,3,4};

等等等等,你会怎么做呢?我正在尝试编写一个程序来检查用户输入的数字是否包含长度为 k 的回文(其中 k 也由用户选择),我的想法是将数字存储在一个数组中,取前 3 个成员,把它们在一个数组中,将它们反转并将其放入另一个数组中然后进行比较,但我仍然坚持如何解决我上面提到的问题,我尝试了类似的方法:

void copyandReverse(int arr[], int copy[], int reverse[], int start, int length)
{
    for(int i=0; i<length; i++)
    {
        copy[start+i]=arr[start+i];
        reverse[start+i]=arr[start+length-i-1];

    }
}

但好像只复制了前3个元素,然后倒过来。

PS:我认为我们不允许使用字符串或动态内存分配,因为输入的数字包含少于 10 位数字,所以我制作了具有恒定大小的临时数组10.

无需创建辅助数组来检查给定数组是否为回文。

这可以做得更简单。

像这样写一个函数

int is_palindrome( const unsigned int a[], size_t n )
{
    size_t i = 0;

    while (i < n / 2 && a[i] == a[n - i - 1]) ++i;

    return i == n / 2;
}

然后在主如果你有一个像

这样的数组
unsigned int a[10];

并且你需要检查一个包含三个元素的子数组是否是回文,那么你可以在for循环中完成

size_t k = 3;

for ( size_t i = 0; i <= 10 - k; i++ )
{
    if ( is_palindrome( a + i, k ) ) 
    {
        printf( "The sub-array at position %zu:", i );
        for ( size_t j = i; j < k + i; j++ ) printf( " %u", a[j] );
        puts( " is a palindrome" );
    }
}

如@stark 所述,只需使用两个索引遍历数组。 请参阅下面的示例实现。您只需要在验证之前评估用户输入的实际大小。

下面的代码假定 0 作为分隔符。在收集到实际用户输入大小后,我们开始一个索引为 ij 的循环。循环直到他们交换位置。

如果存在不匹配,我们returnFALSE,否则TRUE

#include <stdio.h>

#define TRUE 1
#define FALSE 0

size_t getUserInputLength(int *arr, size_t len)
{
  for (size_t i = 0; i < len; i++)
  {
    if (arr[i] == 0)
    {
      return i;
    }
  }
  return len;
}

int checkPalindrome(int *arr, size_t len)
{
  size_t i, j;
  for (i = 0, j = len - 1; i <= j; i++, j--)
  {
    printf("Current indices: [i: %ld, j: %ld]\n", i, j);
    printf("Current values: [i: %d, j: %d]\n", arr[i], arr[j]);
    if (arr[i] != arr[j])
    {
      return FALSE;
    }
  }
  return TRUE;
}

int main()
{
  // even number of user input
  int evenInput[] = {1, 2, 3, 4, 3, 2, 1, 0, 0, 0};
  size_t evenLen = getUserInputLength(evenInput, 10);
  printf("Even number returned: %d\n", checkPalindrome(evenInput, evenLen));

  // odd number of user input
  int oddInput[] = {1, 2, 3, 2, 1, 0, 0, 0, 0, 0};
  size_t oddLen = getUserInputLength(oddInput, 10);
  printf("Odd number returned: %d\n", checkPalindrome(oddInput, oddLen));

  return 0;
}