【发布时间】:2019-06-01 19:03:54
【问题描述】:
我来自 C 背景,最近开始使用 C# 编写代码,所以请不要介意我的问题是否有点基础。基本上,我想编写一个函数,如果字符串是回文则返回 true,否则返回 false。
字符串可能包含空格、','、':' 等我必须忽略的字符。我已经编写了如下代码
static bool IsPalindrome(string s)
{
s = s.Replace(" ", "");
s = s.Replace(",", "");
s = s.Replace(":", "");
int j = s.Length - 1;
for(int i = 0; i < s.Length/2; i++)
{
if(s[i].ToString().Equals(s[j].ToString(),StringComparison.InvariantCultureIgnoreCase))
{
j--;
}
else
{
return false;
}
}
return true;
}
将使用以下字符串调用函数的位置
string s = "A man, a plan, a canal: Panama";
我在文档中读到,在 C# 中,字符串是不可变的,因此每次我执行替换或 ToString 之类的操作时,都会创建一个新副本。
所以我想检查一下 一世)。这段代码有效吗? ii)。如果没有,如何提高效率。
【问题讨论】:
-
不要把一个字符转成字符串,然后比较两个字符转成字符串。将字符(一个简单的 16 位数值)转换为字符串(将在堆上分配并接受垃圾回收的对象)可能是您可以做的最昂贵的事情,如果您真正想要的是比较到字符...
-
为了提高效率,您可以在检查回文的循环中跳过它们,而不是替换字符(这需要遍历字符串 3 次)。
-
如果你想以不区分大小写的方式比较字符,在比较之前将字符转换为大写或小写(
char/System.Char有这样的方法) -
您的代码可以通过使用
while循环和两个指向字符串开头和结尾的变量来提高效率。增加起始值,减少结束值并跳过您不感兴趣的字符。 -
但这几乎可以肯定是一个家庭作业问题,也许你应该问你的导师?
标签: c# palindrome