问题:给定逗号分隔的数字字符串,想要找出数字的最高位数。 例如:考虑一串数字“123,345,555”,输出为5,因为5是123,345,555中的最高平均值。
这是我的程序..在C#
int Max_Avg(string number_list)
{
int i;
Int32 sum;
Int32 max_avg = 0;
int limit = 0;
string[] num = number_list.Split(',');
limit = num.Length;
while (limit-- > 0)
{
i=0;
sum = 0;
while (i < num[limit].Length)
{
sum += Convert.ToInt32(num[limit].Substring(i, 1));
i++;
}
int tmp=sum / num[limit].Length;
if (tmp > max_avg)
{
max_avg = tmp;
}
}
return max_avg;
}
如果有任何人可以优化其性能或建议更优化的方法来加快它......
答案 0 :(得分:8)
(针对可维护性/代码而非原始性能进行了优化)
return (int) number_list.Split(',')
.Select(term => term.Average(c => (int) (c - '0'))).Max();
答案 1 :(得分:1)
我看到的唯一合理的速度优化是在这一行:
Convert.ToInt32(num [limit] .Substring(i,1));
这很慢 - 您将字符串按字符分割为子字符串,然后使用通用解析器。
子功能可以接受char,然后在10个有效的valeus(0-9)上进行SWITCH,或者直接将char的numberic值转换为数字。这是你所能做的一切。我认为COnvert.ToInt32方法过于通用,无法快速实现。
只有在你做了数千次这样的事情时才有意义,但是哎呀,我会在这样的优化时刻写数据解析器,这样会大大提高它们。
答案 2 :(得分:0)
int Max_Avg(string number_list)
{
var result = 0;
var sum = 0;
var count = 0;
for (var i = 0; i < number_list.Length; i++)
{
if (number_list[i] == ',')
{
if (count > 0)
{
result = math.Max(result, sum / count);
sum = 0;
count = 0;
}
}
else
{
sum += number_list[i] - '0';
count++;
}
}
return result;
}