从uint输入确定回文

时间:2017-05-04 16:48:12

标签: c# asp.net arrays string

鉴于以下内容:

protected bool IsPalindrome(uint x) // Samples: 1221, 456653
{

}

确定输入是否是回文的最佳方法是什么?最初,我通过将输入数字放入一个数组,在for循环中将其反转并将其分配给临时数组进行比较来尝试数组。然而,索引语法变得非常快,所以我决定简单地将uint视为字符串。

以下是面试白板情况下的有效解决方案,还是我仍然过于复杂?

protected bool IsPalindrome(uint x) 
{
    string givenNum = Convert.ToString(x);
    char[] input = givenNum.ToCharArray();
    Array.Reverse(input);

    string testString = String.Empty;
    foreach (char a in input)
        testString += a;

    if (givenNum == testString)
        return true;
    else
        return false;
}

3 个答案:

答案 0 :(得分:5)

将数字转换为字符串,如果该字符串等于反向字符串,那么它就是一个回文:

protected bool IsPalindrome(uint x) { 
    string test = x.ToString();
    string tset = new string(test.ToCharArray().Reverse().ToArray());
    return test == tset;
}

答案 1 :(得分:4)

为了提高效率,您可以执行以下操作以数字方式进行反向比较

protected bool IsPalindrome(uint x)
{
    uint original = x;
    uint reverse = 0;
    while (x > 0) 
    {
        reverse *= 10;
        reverse += x % 10;
        x /= 10;
    }

    return original == reverse;
}

答案 2 :(得分:1)

  

注意:由于问题明确要求uint类型作为输入,您可能会认为访调员并不真的希望看到任何字符串转换方法,而是数学那些。请参阅juharr's implementation以获取与我的第二个示例类似的示例,但将字符串的使用替换为一些模运算来确定正确性。

简答

如果您已经在使用Array.Reverse()方法,那么您可以简单地将字符串与其反向进行比较:

protected bool IsPalindrome(uint x)
{
    // Get your string
    var s = x.ToString();

    // Reverse it
    var characters = s.ToCharArray();
    Array.Reverse(characters);

    // If the original string is equal to the reverse, it's a palindrome
    return s == new string(characters);
}

更高效(并且可能是面试)答案

在面试环境中,面试官可能正在寻找一些不一定能利用语言中所有现有内置函数的东西,并且可能需要更加简单的性能/算法方法(例如跟踪索引) ,并比较可能不需要您遍历每个元素的位置值。)

仍然使用字符串转换的实现可能类似于this response

protected bool IsPalindrome(uint x)
{ 
    // Build your string
    var chars = x.ToString();

    // Iterate through half of the elements
    for (var i = 0; i < chars.Length / 2; i++)
    {
         // If they are ever not equal, then it's not a palindrome
         if (chars[i] != chars[chars.Length - 1 - i])
         {
              return false;
         }
    }

    // If you've made it through, then you have a palindrome
    return true;
}

效果比较

您可以使用Stopwatch()类来实际查看哪些在给定数据集上表现更好。使用50,000个随机整数值和上面详述的方法,我在本地收到了以下结果:

ShortAnswerApproachDuration: 00:00:00.0890155
  EfficientApproachDuration: 00:00:00.0693814

从中得出一些观察结果:

  • 由于有效的方法不会每次都遍历所有元素,并且一旦识别出元素不是回文就会退出,它会更快(大约22%)。
  • 有效的方法在存储/内存方面也更有效,因为它不需要存储反转阵列的副本。

您可以尝试更改算法并在线测试here

其他注意事项

根据访问者想要获得的具体方式,他们可能会抛出诸如处理实际字符串和句子,处理标点符号和大写之间的大写,这些都是非常简单的调整(例如使用不区分大小写的比较等)。