【问题标题】:how to refactor code to return IsPalindrome如何重构代码以返回 IsPalindrome
【发布时间】:2019-04-09 01:40:01
【问题描述】:

https://www.testdome.com/t 上使用模拟 c# 问题

我已经编码了

using System;

public class Palindrome
{
   public static bool IsPalindrome(string word)
        {
            string testWord = word;

            string first = word[0].ToString();
            string last = word[word.Length - 1].ToString();

            bool isPal = false;

            while (testWord.Length > 1)
            {
                Console.WriteLine(testWord);

                if (first.ToLower() == last.ToLower())
                {
                    testWord = testWord.Remove(0,1);
                    testWord = testWord.Remove(testWord.Length - 1);

                    isPal = true;
                }

            }

            return isPal;
        }

    public static void Main(string[] args)
    {
        Console.WriteLine(Palindrome.IsPalindrome("Deleveled"));
    }
}

此代码正在运行,但它让我失望了 小写单词:超过时间限制 各种词:超过时间限制。

我可以进行哪些更改来重构代码以更快地工作?

【问题讨论】:

  • 就在我的脑海中(可能不适合这里),但也许只考虑reversing the string 并测试ToLower(result) 是否与ToLower(input) 匹配。就像 5 行代码,没有循环。
  • 如果第一个和最后一个字符不相等,您将永远循环。在if 上添加else return false;
  • 您的问题不是性能而是正确性。
  • 感谢大家的帮助。如果你想要积分,我和@JNevill 一起去了。添加答案,我会打勾
  • @John 请注意 ToUpperInvariant should be better。 (Or not。)但最终,如果您同意/允许分配另一个反向字符串,那么您应该将其与原始字符串与String.Equals (s1, s2, StringComparison.OrdinalIgnoreCase) 进行比较,而不是将两个字符串都转换为小写或大写。

标签: c#


【解决方案1】:

不用写多行代码,一行就能查回回文,

Linq 的魔法,

bool isPalindrome = str.SequenceEqual(str.Reverse());

如果要忽略大小写,则将原始字符串和反向字符串转换为小写,然后检查其顺序

    string str = "Madam";
    var strReverse = str.ToLower().Reverse();
    var isPalindrome = str.ToLower().SequenceEqual(strReverse);

基本上,回文检查是实际字符串等于其反向的检查。当我们检查原始字符串以反转字符串时,我们需要 not 走到最后。我们只需要检查第一个字母和它的最后一个等等......

这是非 Linq 回文检查,

   public static bool IsPalindrome(string word)
    {
        string testWord = word;
        for(int i = 0; i < word.Length/2; i++)
        {
            if(char.ToLower(testWord[i]) != char.ToLower(testWord[testWord.Length - i - 1]))
               return false;
        }
        return true;
    }

POC:. net fiddle

【讨论】:

  • 感谢您的回复,但在此模拟中不允许使用 linq
【解决方案2】:

如果发现不匹配,您可以做的一件事是立即返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多