namespace Palindrome
{
class Program
{
public static bool IsPalindrome(string s)
{
int min = 0;
int max = s.Length - 1;
while (true)
{
if (min > max) // True if we've compared up to, and then gone passed the middle of the string.
return true;
if (char.ToLower(s[min++]) != char.ToLower(s[max]))
return false;
}
}
static void Main(string[] args)
{
string [] words = {
"civic",
"deified",
// ...
"stats",
"tenet",
};
foreach (string value in words)
{
Console.WriteLine("{0} = {1}", value, IsPalindrome(value));
}
Console.WriteLine("\nPress any key to continue...");
Console.ReadKey(true); }
}
}
该程序检查单词数组中的单词是否为Palindromes(单词拼写为向前和向后拼写相同)。
Main中的foreach
循环将数组中的每个单词传递给IsPalindrome()
函数;它测试单词,并相应地返回True或False。
由于当前数组中的每个单词都是Palindrome,当程序运行时,它应该输出所有当前单词,然后输出True。但是,它给了我错误。那是为什么?
答案 0 :(得分:3)
对我来说,像你一样忘记了max
的价值;即以下内容:
if (char.ToLower(s[min++]) != char.ToLower(s[max]))
......应该是:
if (char.ToLower(s[min++]) != char.ToLower(s[max--]))
无论如何,如果你在调试模式下运行它,并且单步执行代码,你应该能够很快清除它。
答案 1 :(得分:2)
尝试
if (char.ToLower(s[min++]) != char.ToLower(s[max--]))
return false;
答案 2 :(得分:1)
我认为您忘记减少max
变量。
现在你只是将每个字母与最后一个字母进行比较。
答案 3 :(得分:0)
您已经获得了有关代码的错误的答案。这是一个更清洁的解决方案选项(如果您不需要任何性能优化):
public static bool IsPalindrome(string s)
{
char[] array = s.ToCharArray();
Array.Reverse(array);
string backwards = new string(array);
return s.Equals(backwards, StringComparison.OrdinalIgnoreCase);
}
答案 4 :(得分:0)
您必须降低最大值。
另一种测试方法。
var input = "abba";
var output = input.ToCharArray().Reverse().Aggregate("",(x,y) => x + y));
return input.Equals(output, StringComparison.OrdinalIgnoreCase);
答案 5 :(得分:0)
在这里,一个更好的文化/不区分大小写的版本
using System.Globalization;
bool IsPalindrome(string value, StringComparer comparer = null)
{
if (s == null)
{
throw new ArgumentNullException("value");
}
if (comparer == null)
{
comparer = StringComparer.CurrentCultureIgnoreCase;
}
var elements = new List<string>();
var m = StringInfo.GetTextElementEnumerator(value);
while (m.MoveNext())
{
elements.Add(m.GetTextElement());
}
var i = 0;
var j = elements.Count - 1;
var limit = elements.Count / 2;
for(; i <= limit; i++, j--)
{
if (!comparer.Equals(elements[i], elements[j]))
{
return false;
}
}
return true;
}