检查数组是否满足两个条件。

huangapple go评论85阅读模式
英文:

checking array if contains two condition

问题

假设我有以下代码:

如果 arr 包含正数和负数,则返回 0。
如果 arr 只包含正数,则返回最小的数(除了 0)。
如果 arr 只包含负数,则返回最大的数(除了 0)。

func sesi(arr []int) int {
    minmax := arr[0]
    for _, v := range arr {
        if v >= 0 && v <= 0 {
            minmax = 0
            return minmax
        } else if v > 0 {
            if v < minmax {
                minmax = v
                return minmax
            }
        } else if v < 0 {
            if v < minmax {
                minmax = v
                return minmax
            }
        }
    }
    return minmax
}

请注意,这段代码存在一些问题。首先,条件 v >= 0 && v <= 0 永远不会为真,因为一个数不可能同时大于等于 0 和小于等于 0。其次,在找到第一个满足条件的数后,立即返回结果会导致函数提前结束,可能无法正确处理整个数组。你可能需要对代码进行修正。

英文:

Suppose I have the following

if arr contains negative and positive number, should return 0.
if arr only have positive number, return the smallest number (except 0).
if arr only have negative number, return the biggest number (except 0).

func sesi(arr []int) int {
minmax := arr[0]
for _, v := range arr {
	if v &gt;= 0 &amp;&amp; v &lt;= 0 {
        minmax=0
		return minmax
	} else if v &gt; 0 {
		if v &lt; minmax {
			minmax = v
			return minmax
		}
	} else if v &lt; 0 {
		if v &lt; minmax {
			minmax = v
			return minmax
		}
	}
}
return minmax }

答案1

得分: 1

所以你没有考虑输入是一串零的情况,我假设在这种情况下应该返回零。你还说,一串负数值应该返回“最大的数”,我假设这意味着最高的值(即-123 < -1 => 返回-1)。通过对输入的切片进行排序,这个任务就变得很简单:

func sesi(in []int) int {
    if len(in) == 0 {
        return 0 // 检查空输入
    }
    sort.Ints(in) // 对整数进行排序,按升序排列
    if in[0] < 0 {
        last := in[len(in)-1] // 输入中的最高值
        if last > 0 {
            return 0 // 最低值为负数,最高值为正数
        }
        return last // 全部为负数(不检查零),返回最高值
    }
    if in[0] > 0 || len(in) == 1 { // 第一个元素为正数 > 0,或者只有一个元素(可能是 []int{0})
        return in[0]
    }
    for i := 1; i < len(in); i++ {
        if in[i] > 0 {
            return in[i] // 在正数切片中找到最小的非零值
        }
    }
    return 0 // 切片中除了零以外没有其他值
}

演示

如果在全负数的切片中,通过“最大的数”实际上是指最大的绝对值(即-123,-1 => 返回-123),你只需要将我分配last := in[len(in)-1]的部分更改为:

if in[0] < 0 {
    if in[len(in)-1] > 0 {
        return 0
    }
    return in[0] // 最小值,最大的绝对值
}

简单而明了。

英文:

So you're not accounting for the input being a slice of zeroes, I'm assuming in that case zero has to be returned. You also state that a slice of negative only values should return "the biggest number" I've assumed that this means the highest value (ie -123 < -1 => returns -1). By sorting the input slice, this is a trivial task to do:

func sesi(in []int) int {
    if len(in) == 0 {
        return 0 // check for empty input
    }
	sort.Ints(in) // sort the integers, in ascending order
	if in[0] &lt; 0 {
		last := in[len(in)-1] // highest value in the input
		if last &gt; 0 {
			return 0 // lowest value is negative, highest is positive
		}
		return last // all negative (not checking for zeroes), return highest value
	}
	if in[0] &gt; 0 || len(in) == 1 { // first element is positive &gt; 0, or we only have 1 element (could be []int{0})
		return in[0]
	}
	for i := 1; i &lt; len(in); i++ {
		if in[i] &gt; 0 {
			return in[i] // find smallest non-zero value in a positive slice
		}
	}
	return 0 // slice contains no values other than zeroes
}

Demo

If, by "biggest number" in an all-negative slice you actually meant to say the biggest absolute value (ie -123, -1 => return -123), you just need to change the bit where I'm assigning last := in[len(in)-1] to this:

if in[0] &lt; 0 {
    if in[len(in)-1] &gt; 0 {
        return 0
    }
    return in[0] // smallest value, largest absolute value
}

Nice and simple

huangapple
  • 本文由 发表于 2022年8月16日 17:18:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/73371621.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定