检查字符串是否是回文的非正统方法

时间:2017-10-01 20:45:56

标签: c#

我试图创造一种非正统的方法来解决一个字符串是否是回文。我知道您可以使用的当前.Reverse()方法,但这是我尝试这样做的方式:

用户将输入字符串,然后程序将检查字符串的第一个和最后一个字母。如果它们是相同的,它将继续检查。如果它们不是(在开始或在任何特定点),那么程序将声明它不是回文。一旦程序停止检查并发现没有相同的字母,它将声明它是一个回文。

以下是我目前的代码:

using System;
using System.Collections.Generic;

namespace tasks
{ 
    class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Enter a message and I will check if it     is a palindrome: ");
            string message1 = Convert.ToString(Console.ReadLine().ToLower());
            char[] message = message1.ToCharArray();
            int i = 0;
            int j = message.Length - 1;
        if (message[i] == message[j])
        {
            do
            {
                i++;
                j--;
                if (message[i] == message[j])
                    Console.Write("This is a palindrome");
                else if (message[i] != message[j])
                    Console.Write("This is not a palindrome");
                break;
            } while (message[i] == message[j]);
        }
        else if (message[i] != message[j])
        {
            Console.WriteLine("This is not a palindrome");
        }
    }
}

(对于缩进感到抱歉)。

如果我要输入' haegah',程序会说这是一个回文。当它显然不是。我的问题是,是什么导致我的程序执行此操作以及如何解决它?

1 个答案:

答案 0 :(得分:2)

你忽略了在{周围包裹}Console.Write("This is not a palindrome"); break;。执行此操作时,只有第一个表达式变为条件break;未封装在else分支内,并且将无条件执行,因此在第一次迭代中终止循环

这解释了我认为导致您的一个问题,以及如何解决它。但是,还有其他问题。

通过在比较字符之前递增和递减计数器,您将跳过两个字符(开头和结尾处的字符)。你可以执行增量和增量在循环条件下同时递减,比较如下:message[i++] == message[j--] ...

即使你修复了这些,你的循环也不会终止;两个变量将重叠,然后你继续直到一个是负数而另一个是超出界限(从技术上讲,它们都是超出范围的)...除了你的循环执行时message[i] == message[j],它也应该只在i < j时执行。

但等等,另一个问题!当字符串是空字符串时,您认为会发生什么?您需要在循环之前防范条件,或使用while (...) { ... }循环。