c - 查找 int 数组 C 中的所有回文
问题描述
它可能看起来很长,但我过度解释了。
所以我的问题不一定是找到回文它只是找到回文的长度我无法弄清楚而且我的代码不适用于一位数回文(是的,我们也计算它们)所以这里是代码和解释:
#include <stdio.h>
#define LEN 9
int *lastEqual(int *p, int *q) {
int *rightmost;
int *temp;
int *zero = p;
while (p <= q) {
if (*zero == *(p + 1)) {
temp = p + 1;
if (temp < q) {
rightmost = temp;
}
}
p++;
}
return rightmost;
}
这个函数做什么或应该做什么:
*对于给定的数组: { 3 ,6,7,8,7,6,5, 3 , 5 } 如果 lastEqual 被粗体数字的引用调用,它返回一个指向 3 的指针。(最接近数组结束)*
*对于给定的数组: {3, 6 ,7,8,7, 6 ,5,3, 5 } 如果 lastEqual 被粗体数字的引用调用,它返回一个指向 6 的指针。*
这是第二个功能:
int isPalindromic(int *p, int *q) {
int *left = p;
int *right = q;
int pali;
while (left < right) {
if (*left == *right) {
pali = 1;
} else {
pali = 0;
}
left++;
right--;
}
return pali;
}
这是它所做的或应该做的:
对于给定的数组: { 3 ,6,7,8,7,6,5, 3 ,5} 如果 isPalindromic 由粗体数字的引用调用,则返回 0,因为这些地址之间的数字不代表回文.
对于给定的数组: {3, 6 ,7,8,7, 6 ,5,3,5} 如果 isPalindromic 由粗体数字的引用调用,则返回 1,因为这些地址之间的数字表示回文。
这是主要功能:
int main() {
int *p, *q, *rightmost;
int arr[LEN] = { 3, 6, 7, 8, 7, 6, 5, 3, 5 };
p = arr;
q = p + (LEN - 1);
for (int i = 0; i < LEN; i++) {
if (isPalindromic(p + i, lastEqual(p + i, q)) == 1) {
rightmost = lastEqual(p + i, q);
printf("Palindrome at index %d, length %ld\n", i, &p - &rightmost);
}
}
return 0;
}
并且输出应该是这样的,但我不知道如何找到长度以及为什么它不将单个数字计算为像这样的回文 8 :
{3,6,7,8,7,6,5,3,5}
所以 3 到 3 不是回文 6 到 6 是 7 到 7 是 8 也应该被计算,因为没有一对 8
输出应该是这样的:
Input Array: {1}
Output: “palindrome at index 0, length: 1”
Input Array: {5, 6, 7, 8, 7, 6, 5, 2, 5}
Output: “palindrome at index 0, length: 7”
Input Array: {2, 7, 6, 11, 10, 11, 6, 5, 3}
Output: “palindrome at index 2, length: 5”
Input Array: {7, 8, 9, 8, 7}
Output: “palindrome at index 0, length: 5”
Input Array: {2, 7, 4, 3, 2, 6, 1, 2, 1}
Output: “palindrome at index 6, length: 3”
解决方案
这是isPalindromic
具有相同参数的更简单版本,以及main()
查找所有回文的更简单版本:
#include <stdio.h>
int isPalindromic(int *p, int *q) {
while (p < q) {
if (*p++ != *q--)
return 0;
}
return 1;
}
int main() {
int arr[] = { 3, 6, 7, 8, 7, 6, 5, 3, 5 };
int len = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < len; i++) {
for (int j = i; j < len; j++) {
if (isPalindromic(arr + i, arr + j))
printf("Palindrome at index %d, length %d\n", i, j - i + 1);
}
}
return 0;
}
如果您只想输出最长的回文,请将main
函数更改为:
int main() {
int arr[] = { 3, 6, 7, 8, 7, 6, 5, 3, 5 };
int len = sizeof(arr) / sizeof(arr[0]);
int max_pos = 0, max_len = 1;
for (int i = 0; i < len; i++) {
for (int j = i + max_len; j < len; j++) {
if (isPalindromic(arr + i, arr + j)) {
max_pos = i;
max_len = j - i + 1;
}
}
}
printf("Longest palindrome at index %d, length %d\n", max_pos, max_len);
return 0;
}
推荐阅读
- ruby-on-rails - 如何在 Rails 模板中在 content_for 之前使用 yield :content?
- javascript - 如何使用 Node.js 查询 mysql 数据库以通过 url 中的名称获取特定用户(字段),而不仅仅是通过 ID
- node.js - 如何区分linux原版命令和第三方软件命令
- javascript - 在事件中传递 JSON 文件:事件无法读取键,只能读取值
- ios - GRPC IOS 客户端连接丢失 - 目标 C
- python - 使用 QFileSystemModel 展开 QTreeView 中的项目
- javascript - 动态创建的下拉菜单未打开
- microsoft-graph-api - 在“oneDrive.item”类型上获取“属性 'openWith' 不是导航属性。” 尝试访问工作簿 api 时
- windows - 从不同的 powershell 会话访问在一个 powershell 会话中创建的远程 powershell 会话
- python-3.x - 我想拆分数据并按行和列获取值