创建回文

时间:2014-12-11 11:33:08

标签: c# .net console-application palindrome

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。但是,它给了我错误。那是为什么?

6 个答案:

答案 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;
}