检查字符串中的数字是否对称(在边缘)
Checking if digits in a string are symmetric (in edges)
我有一串数字。我需要检查边上的数字是否对称,这意味着它们在以 2 为模时具有相同的余数。
我写了一个有效的代码,但我对此有些困扰,在一些失败之后我想出了这个代码:
int PaliPair(char* st, int n)
{
if(n<=1) return 1;
return (*st%2 == *(st+n-1)%2) && PaliPair(st +1, n-2);
}
问题是,为什么我必须 return n-2
而不是 n-1
?我有点困惑为什么它有效。任何解释将不胜感激。我想我遗漏了一些东西,也许是字符串以 "[=13=]"
结尾的事实,我需要从中得出结论。
假设您的字符串是21312
,第一步您将从两端比较2 和2。然后你向前迈出 st+1
你应该考虑 131
,所以你不应该从字符串的开头和结尾考虑 2
,这就是为什么你做 n-2
.
在这种方式下,您可以从字符串的开头向前移动一个字符,但您也应该从字符串的结尾向后移动一个字符。
我希望你明白我的意思。
如果你有这样的字符串
"1243"
然后你首先检查第一个和最后一个字符。
然后你需要检查中间的字符
"24"
因此目标字符串现在的长度为 4 - 2(已检查的字符数)
因此在每次递归中检查 2 个字符,在下一次递归中您需要检查少 2 个字符。
至于函数本身我会这样写
int PaliPair( const char *s, size_t n )
{
return n < 2 || *s % 2 == *( s + n - 1 ) % 2 && PaliPair( s + 1, n - 2 );
}
甚至喜欢
int PaliPair( const char *s, size_t n )
{
return n < 2 || ( *s - '0' ) % 2 == ( *( s + n - 1 ) - '0' ) % 2 && PaliPair( s + 1, n - 2 );
}
我有一串数字。我需要检查边上的数字是否对称,这意味着它们在以 2 为模时具有相同的余数。
我写了一个有效的代码,但我对此有些困扰,在一些失败之后我想出了这个代码:
int PaliPair(char* st, int n)
{
if(n<=1) return 1;
return (*st%2 == *(st+n-1)%2) && PaliPair(st +1, n-2);
}
问题是,为什么我必须 return n-2
而不是 n-1
?我有点困惑为什么它有效。任何解释将不胜感激。我想我遗漏了一些东西,也许是字符串以 "[=13=]"
结尾的事实,我需要从中得出结论。
假设您的字符串是21312
,第一步您将从两端比较2 和2。然后你向前迈出 st+1
你应该考虑 131
,所以你不应该从字符串的开头和结尾考虑 2
,这就是为什么你做 n-2
.
在这种方式下,您可以从字符串的开头向前移动一个字符,但您也应该从字符串的结尾向后移动一个字符。 我希望你明白我的意思。
如果你有这样的字符串
"1243"
然后你首先检查第一个和最后一个字符。
然后你需要检查中间的字符
"24"
因此目标字符串现在的长度为 4 - 2(已检查的字符数)
因此在每次递归中检查 2 个字符,在下一次递归中您需要检查少 2 个字符。
至于函数本身我会这样写
int PaliPair( const char *s, size_t n )
{
return n < 2 || *s % 2 == *( s + n - 1 ) % 2 && PaliPair( s + 1, n - 2 );
}
甚至喜欢
int PaliPair( const char *s, size_t n )
{
return n < 2 || ( *s - '0' ) % 2 == ( *( s + n - 1 ) - '0' ) % 2 && PaliPair( s + 1, n - 2 );
}