鉴于以下内容:
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;
}
答案 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
从中得出一些观察结果:
您可以尝试更改算法并在线测试here。
其他注意事项
根据访问者想要获得的具体方式,他们可能会抛出诸如处理实际字符串和句子,处理标点符号和大写之间的大写,这些都是非常简单的调整(例如使用不区分大小写的比较等)。