在上周的一次工作面试中,我被要求在白板上做一个StringToInt / Int.parse功能,表现不是很好,但我想出了一些解决方案。后来回到家,我在Visual Studion上做了一个,我想知道是否有比我下面的更好的解决方案。
除了检查字符串是否只包含数字之外,不再进行任何错误处理。
private int StrToInt(string tmpString)
{
int tmpResult = 0;
System.Text.Encoding ascii = System.Text.Encoding.ASCII;
byte[] tmpByte = ascii.GetBytes(tmpString);
for (int i = 0; i <= tmpString.Length-1; i++)
{
// Check whatever the Character is an valid digit
if (tmpByte[i] > 47 && tmpByte[i] <= 58)
// Here I'm using the lenght-1 of the string to set the power and multiply this to the value
tmpResult += (tmpByte[i] - 48) * ((int)Math.Pow(10, (tmpString.Length-i)-1));
else
throw new Exception("Non valid character in string");
}
return tmpResult;
}发布于 2010-05-31 20:32:08
我认为您的解决方案还不错,但我不会使用math.pow,而是:
tmpResult = 10 * tmpResult + (tmpByte[i] - 48);另外,根据tmpByte而不是tmpString的长度检查长度。这通常并不重要,但在循环一个数组的同时检查另一个数组的长度是相当奇怪的。
而且,您可以用foreach语句替换for循环。
发布于 2010-05-31 21:08:02
我将采取一种相反的方法。
public int? ToInt(this string mightBeInt)
{
int convertedInt;
if (int.TryParse(mightBeInt, out convertedInt))
{
return convertedInt;
}
return null;
}在被告知这不是问题的重点之后,我认为这个问题测试的是C编程技能,而不是C#。我进一步认为,在.NET中,将字符串视为字符数组是一个非常不好的习惯,因为字符串是unicode,并且在任何可能全球化的应用程序中,对字符表示进行任何假设迟早会给您带来麻烦。此外,该框架已经提供了一种转换方法,它将比开发人员匆忙抛出的任何东西更有效和可靠。重新发明框架功能总是一个不好的主意。
然后我会指出,通过编写一个扩展方法,我已经为string类创建了一个非常有用的扩展,这是我在生产代码中实际使用的东西。
如果这个论点让我丢掉了工作,我可能无论如何都不想在那里工作了。
编辑:正如一些人指出的那样,我错过了TryParse中的" out“关键字。已修复。
发布于 2010-05-31 20:33:19
没有必要转换为字节数组,因为字符串已经是一个char数组了。另外,应该避免使用像48这样的幻数,而应该使用像'0'这样的可读常量。我是这样做的:
int result = 0;
for (int i = str.Length - 1, factor = 1; i >= 0; i--, factor *= 10)
result += (str[i] - '0') * factor;对于每个字符(从末尾开始),将其数值乘以正确的10次方得到结果。10的幂是通过重复将其与10相乘来计算的,而不是不必要地使用Math.Pow。
https://stackoverflow.com/questions/2943499
复制相似问题