谁能检查这个 Palindrome c++ 代码是不是正确?
Posted
技术标签:
【中文标题】谁能检查这个 Palindrome c++ 代码是不是正确?【英文标题】:Can anyone check if this Palindrome c++ code is correct?谁能检查这个 Palindrome c++ 代码是否正确? 【发布时间】:2019-06-18 09:03:22 【问题描述】:这是我为检查 C++ 中的回文词而构建的程序。它不能以通常的方式工作(反转单词并检查是否相同),但它直接从开头和结尾检查每个单词;
女士,阿达,汉娜,赛车是我尝试过的词,它们似乎是正确的。
#include <iostream>
std::string is_palindrome(std::string text)
int length=text.size(); //No. of characters
int index=text.size()-1; //No. of indexes
int i;
int x=0; //To store no of same character from both ends
for(i=0;i<=index;i++)
if(text[i]==text[index-i])
x++;
if(x==length) //If all characters are same form opp ends
return "true";
else
return "false";
int main()
std::cout << is_palindrome("madam") << "\n";
std::cout << is_palindrome("happy") << "\n";
结果是正确的,我只是找不到这样的代码,所以只想检查一下。
【问题讨论】:
你可能想把这个发到codereview.stackexchange.com。 我认为你不应该遍历所有字符,而应该只遍历一半以上的字符,即for(int i = 0; i <= index / 2; i++)
。只要任何对不相等,您就可以退出(假)而不是计算相等的字符。
另外,你可以检查 if(text[i] != text[index-i]) return false;
是否是x
。
我不会返回std::string
,而是返回bool
,在需要时将bool
转换为string
比将"true"
/ "false"
转换为@ 要容易得多987654333@以备不时之需
属于codereview.stackexchange.com
【参考方案1】:
你的函数太复杂了。参数应该是常量引用类型,函数应该返回一个布尔值。
下面是一个演示程序,显示了函数使用循环的外观。
#include <iostream>
#include <iomanip>
#include <string>
bool is_palindrome( const std::string &s )
std::string::size_type i = 0, n = s.length();
while ( i < n / 2 && s[i] == s[n - i - 1] ) ++i;
return i == n / 2;
int main()
std::cout << std::boolalpha << is_palindrome( "madam" ) << "\n";
std::cout << std::boolalpha << is_palindrome( "happy" ) << "\n";
return 0;
它的输出是
true
false
您可以编写更短的函数,如下面的演示程序所示。但是该函数比使用循环的函数效率低,因为它需要为临时字符串std::string( std::rbegin( s ), std::rend( s ) )
分配内存
#include <iostream>
#include <iomanip>
#include <string>
#include <iterator>
bool is_palindrome( const std::string &s )
return s == std::string( std::rbegin( s ), std::rend( s ) );
int main()
std::cout << std::boolalpha << is_palindrome( "madam" ) << "\n";
std::cout << std::boolalpha << is_palindrome( "happy" ) << "\n";
return 0;
程序输出和上图一样就是
true
false
【讨论】:
【参考方案2】:由于回文是反转时相同的字符串,您可以使用std::equal
和这样的反向迭代器
#include <string>
#include <iostream>
#include <algorithm>
bool is_palindrome(const std::string &str)
return std::equal(str.cbegin(), str.cbegin() + str.size()/2, str.crbegin());
int main()
std::cout << std::boolalpha;
std::cout << is_palindrome("madam") << std::endl;
std::cout << is_palindrome("poppy") << std::endl;
输出:
true
false
这种方法避免了为比较而创建一个反向的临时字符串。
或者,您可以使用两个索引实现一个循环,一个用于左侧,一个用于右侧,左侧递增,右侧递减:
bool is_palindrome(const std::string &str)
int len = str.length();
for (int left = 0, right = len-1; left < right; ++left, --right)
if (str[left] != str[right])
return false;
return true;
【讨论】:
【参考方案3】:是的,您的逻辑是正确的,并且会产生正确的结果。
【讨论】:
【参考方案4】:我同意人们对代码审查的看法,但是,您的代码看起来是正确的。 ......为什么不多扔几个回文版本呢?这是一个使用迭代器的方法,因此您可以使用相等运算符检查任何类型的范围:
template<typename It>
bool is_palindrome(It first, It last)
if(first == last) return true;
It end = std::prev(last);
while(first < end)
if(*first != *end) return false;
std::advance(first, 1);
std::advance(end, -1);
return true;
还有一个单行:
bool is_palindrome = std::equal(str.begin(),
std::next(str.begin(), str.size() / 2),
str.rbegin());
【讨论】:
以上是关于谁能检查这个 Palindrome c++ 代码是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章
python C# - JS - Python - 算法:检查Palindrome