我来自C ++,python背景,最近开始学习C#。但是我偶然发现了一个特殊的问题,在花了相当多的时间后,我无法弄清楚。如果我似乎在尝试一些算法编码问题来学习该语言,那么它似乎太基础了,请原谅。
我有此代码
public class Solution {
public int SmallestRangeII(int[] A, int K) {
float mean = A.Sum() / A.Length;
Console.WriteLine($"the mean is {mean}");
int mini = int.MinValue;
int maxi = int.MaxValue;
foreach(int x in A) {
int temp = x + ((x - mean) < 0 ? K : -K);
Console.WriteLine($"{temp}");
mini = Math.Min(mini, temp);
maxi = Math.Max(maxi, temp);
Console.WriteLine($"{mini} and {maxi}");
}
Console.WriteLine($"the maximum and minimum values are {maxi} and {mini}");
return maxi - mini;
}
}
当我传递代码时,执行此代码时,A = [1]
和K = 0
的参数将得到输出:
the mean is 1
1
-2147483648 and 2147483647
the maximum and minimum values are 2147483647 and -2147483648
在循环的第一次迭代中,为什么maxi
和mini
分别没有修改为1和1?
答案 0 :(得分:0)
首先
温度值计算为1。
int temp = x + ((x - mean) < 0 ? K : -K);
因为K
的值为0
,并根据您的输入将x加上1,即1。
如果您要基于0获得最小值和最大值,那么它将提供与输入相同的结果
了解变量中存储什么值的最佳方法,可以使用Console.WriteLine()
。它将在控制台上为您打印结果。像
foreach(int x in A) {
int temp = x + ((x - mean) < 0 ? K : -K);
Console.WriteLine($"x: "+{x}+"\t mean: "+{mean}+"\t K: "+{K});
Console.WriteLine($"mini: "+{mini}+"\t maxi: "+{maxi});
Console.WriteLine($"{temp}");
mini = Math.Min(mini, temp);
maxi = Math.Max(maxi, temp);
Console.WriteLine($"{mini} and {maxi}");
}
或调试代码
答案 1 :(得分:0)
由于mini
初始化为int.MinValue
,因此Math.Min(mini, temp)
将始终为int.MinValue
您可能想反过来初始化:mini
和int.MaxValue
,maxi
和int.MinValue
。
答案 2 :(得分:0)
我不知道您要做什么,所以我无法提供解决方案,但是如果您查看代码,则可以看到min = -2 ^ 31,并且temp变量等于1您提供的。这两个数字的Math.Min显然会选择较小的数字-> -2 ^ 31。与最大值相同。
如果您尝试获得数组中最大和最小的木材,请尝试将最小和最大的第一个赋值更改为
int min = int.MaxValue();
int max = int.MinValue();
我想这将为您提供所需的解决方案。
答案 3 :(得分:0)
您在 foreach之前将 int.MinValue 设置为 mini ,将 int.MaxValue 设置为 maxi 。 方法,然后调用Min和Max方法以获取最小值和最大值。您应该考虑到在第一次迭代时,mini的值为-2147483648,因此您可以这样调用Min方法:
mini = Math.Min(-2147483648, 1);
此方法适合您。如果要将 mini 值设置为1,则有多种选择。其中之一是将mini和maxi类型更改为可为空的整数(int?)。
int? mini;
int? maxi;
然后在 foreach 中检查其值,如下所示:
foreach (int x in A)
{
int temp = x + ((x - mean) < 0 ? K : -K);
Console.WriteLine($"{temp}");
if(mini.HasValue)
mini = Math.Min(mini.Value, temp);
else
mini = temp;
if(maxi.HasValue)
maxi = Math.Max(maxi.Value, temp);
else
maxi = temp;
Console.WriteLine($"{mini} and {maxi}");
}