如何识别数字数组中的嵌入回文
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
作为分隔符。在收集到实际用户输入大小后,我们开始一个索引为 i
和 j
的循环。循环直到他们交换位置。
如果存在不匹配,我们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;
}
假设我们有
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
作为分隔符。在收集到实际用户输入大小后,我们开始一个索引为 i
和 j
的循环。循环直到他们交换位置。
如果存在不匹配,我们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;
}