创建回文
本文关键字:回文 创建 | 更新日期: 2023-09-27 18:34:05
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); }
}
}
程序检查单词数组中的单词是否是回文(单词向前拼写与向后拼写相同)。
Main 中的 foreach
循环将数组中的每个单词传递给 IsPalindrome()
函数;该函数测试该单词,并相应地返回 True 或 False。
由于当前数组中的每个单词都是回文,因此当程序运行时,它应该输出所有当前单词,后跟 True。 但是,它给了我错误。为什么?
在我看来,
您似乎忘记了减小max
的值; 即以下内容:
if (char.ToLower(s[min++]) != char.ToLower(s[max]))
。应该是:
if (char.ToLower(s[min++]) != char.ToLower(s[max--]))
无论如何,如果您在调试模式下运行它并逐步完成代码,您应该能够很快清除它。
尝试
if (char.ToLower(s[min++]) != char.ToLower(s[max--]))
return false;
我想你忘了递减max
变量。
现在,您只需将每个字母与最后一个字母进行比较即可。
你已经得到了关于代码问题问题的答案。这是一个更干净的解决方案选项(如果您不需要任何性能优化):
public static bool IsPalindrome(string s)
{
char[] array = s.ToCharArray();
Array.Reverse(array);
string backwards = new string(array);
return s.Equals(backwards, StringComparison.OrdinalIgnoreCase);
}
你必须降低你的最大值。
对于另一种测试方法。
var input = "abba";
var output = input.ToCharArray().Reverse().Aggregate("",(x,y) => x + y));
return input.Equals(output, StringComparison.OrdinalIgnoreCase);
你去吧,一个更好的文化/不区分大小写的版本
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;
}