寻找最小正值

8

如何找到固定数量(在这种情况下为3)的值中最小的非零正数或者在没有正数时返回0,哪种算法最好呢?

我的朴素方法如下(使用Delphi编写,但你可以使用任何你喜欢的语言),但我认为还有更优雅的方法。

value1Temp := MaxInt;
value2Temp := MaxInt;
value3Temp := MaxInt;

if ( value1T > 0) then
  value1Temp := value1;
if ( value2 > 0) then
  value2Temp := value2;
if ( value3 > 0) then
  value3Temp  := value3;

Result := Min(value1Temp, Min(value2Temp, value3Temp));
if Result = MaxInt then
  Result := 0;

编辑:抱歉,如果没有正数,则添加所需内容。我以为之前已经加进去了,但可能错过了。


当三个元素都是MaxInt时,您的代码无法正常工作。 - isekaijin
好主意。我可以检查这三个值是否为零,如果是就提前返回(但我知道它们不会是 MaxInt)。 - Ray
如果三个值都是MaxInt,那么MaxInt就是列表中最小的非零正值...对吗? - Troy Howard
是的,没错。但是上面的代码会返回0,而不是MaxInt。 - Ray
21个回答

-1

我看到有太多的代码行,那些试图在C#中解决一般问题。如果“values”是一个IEnumerable<int>,那么

values.Select(v => (int?)v)
      .Where(v => v > 0)
      .Min() ?? 0;

如果存在最小的正值,则返回values中的最小正值,否则返回0。在这里,我利用了Enumerable.Min(IEnumerable<int?>)会在序列为空时返回null的事实。因此,我们过滤掉非正值,然后找到最小值。如果所有值都是非正的,我们将得到所需的零,否则找到正值的最小值。


您的程序可能无法识别两种不同情况:
  • 所有元素都等于Int32.MaxValue
  • 所有元素都是非正数
- isekaijin
这是正确的,然而只要人们意识到这个限制,就不一定是问题。至少代码比其他答案要干净得多。 - Ben Childs
@Eduardo León:这里回溯历史,但我已经解决了您的问题。 - jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接