我试图创造一种非正统的方法来解决一个字符串是否是回文。我知道您可以使用的当前.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',程序会说这是一个回文。当它显然不是。我的问题是,是什么导致我的程序执行此操作以及如何解决它?
答案 0 :(得分:2)
你忽略了在{
周围包裹}
和Console.Write("This is not a palindrome"); break;
。执行此操作时,只有第一个表达式变为条件。 break;
未封装在else
分支内,并且将无条件执行,因此在第一次迭代中终止循环。
这解释了我认为导致您的一个问题,以及如何解决它。但是,还有其他问题。
通过在比较字符之前递增和递减计数器,您将跳过两个字符(开头和结尾处的字符)。你可以执行增量和增量在循环条件下同时递减,比较如下:message[i++] == message[j--]
...
即使你修复了这些,你的循环也不会终止;两个变量将重叠,然后你继续直到一个是负数而另一个是超出界限(从技术上讲,它们都是超出范围的)...除了你的循环执行时message[i] == message[j]
,它也应该只在i < j
时执行。
但等等,另一个问题!当字符串是空字符串时,您认为会发生什么?您需要在循环之前防范条件,或使用while (...) { ... }
循环。