gpt4 book ai didi

c# - 从文件中读取一对数字并处理它们的快速且低内存消耗的方法?

转载 作者:行者123 更新时间:2023-11-30 17:37:29 25 4
gpt4 key购买 nike

好的,这就是我从 CodeEval 获得的挑战。我必须从以标准方式格式化的文件中读取数字,它有一对数字,每行(x,n)用逗号分隔。我必须读入对值并处理它们,然后打印出大于或等于 x 的 n 的最小倍数,其中 n 是 2 的幂。

确切要求:给定数字 x 和 n,其中 n 是 2 的幂,打印出大于或等于 x 的 n 的最小倍数。不要使用除法或模运算符。

我想出了很多解决方案,但没有一个满足计算机让我通过挑战的条件。我只得到部分完成,分数从 30 到 80(从 100)不等。

我假设我的解决方案没有通过速度,但更有可能通过内存使用要求。

如果有人能启发我并提供一些更好、更有效的解决方案,我将不胜感激。

这是我的两个解决方案:

        var filePath = @"C:\Users\myfile.txt";

int x;
int n;

using (var reader = new StreamReader(filePath))
{
string numsFile = string.Empty;
while ((numsFile = reader.ReadLine()) != null)
{
var nums = numsFile.Split(',').ToArray();
x = int.Parse(nums[0]);
n = int.Parse(nums[1]);

Console.WriteLine(DangleNumbers(x, n));
}
}

<<<>>>

        var fileNums = File.ReadAllLines(filePath);

foreach (var line in fileNums)
{
var nums = line.Split(',').ToArray();

x = int.Parse(nums[0]);
n = int.Parse(nums[1]);

Console.WriteLine(DangleNumbers(x, n));
}

查号的方法

    public static int DangleNumbers(int x, int n)
{
int m = 2;
while ((n * m) < x)
{
m += 2;
}

return m * n;
}

我对 C# 和编程还很陌生,但我发现这两种方法从我尝试过的其他几种方法中获得了最好的分数。我认为在每次迭代中创建新的 string 并不是最佳选择,我也不知道如何使用 StringBuilder 并将值放入 Int 从它。

任何指向正确方向的指示都将不胜感激,因为我真的很想通过这个挑战。

最佳答案

n 大于或等于 x 的最小倍数可能是这样的:

if(x <= n)
{
return n;
}
else
{
return x % n == 0 ? x : (x/n + 1) * n;
}

由于 x 和 n 是整数,x/n 的结果将被截断(或实际上向下舍入)。所以下一个大于 x 且是 n 的倍数的整数是 (x/n + 1) * n

由于您没有满足要求,模数版本是最明显的选择。虽然你的方法还是错了。 m = 2 不会导致返回最小值,但如果 n 已经大于 x,它实际上可能是最小值的两倍。

x = 7, n = 8 会得到 16 而不是 8。

同时将 2 添加到 m 会导致类似的问题。

x = 5, n = 2 会得到 8 而不是 6。

请改用以下方法:

public static int DangleNumbers(int x, int n)
{
int result = n;
while(result < x)
result += n;
return result;
}

仍然能够开始优化,但至少根据(现在)规定的约束是正确的。

关于c# - 从文件中读取一对数字并处理它们的快速且低内存消耗的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37987633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com