为了账号安全,请及时绑定邮箱和手机立即绑定

查找列表中的最小数字

查找列表中的最小数字

Go
慕神8447489 2023-05-08 14:42:48
我用 Go 编写了一个程序,它可以找到列表中的最小数字并且它可以工作。但是,我真的不明白其中的逻辑。你能解释一下它是如何工作的吗?package mainimport "fmt"func main() {    x := []int{        48, 96, 86, 68,        57, 82, 63, 70,        37, 34, 83, 27,        19, 97, 9, 17,    }    for i, num := range x {        if num < i {            fmt.Println(num)        }    }}游乐场:https://play.golang.org/p/Awuw2Th1g2V输出:9我教科书中的解决方案不同,我理解那里的逻辑。
查看完整描述

4 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

要找到列表中的最小数字,您需要遍历列表并存储您当前找到的最小数字。将这个“迄今为止最小”的数字与列表中的其他数字进行比较,如果您发现一个较小的数字,请用它替换您的最小数字。在迭代结束时,您将知道列表中的最小数字。


smallest := x[0]            // set the smallest number to the first element of the list

for _, num := range x[1:] { // iterate over the rest of the list

    if num < smallest {     // if num is smaller than the current smallest number

        smallest = num      // set smallest to num

    }

}

fmt.Println(smallest)


查看完整回答
反对 回复 2023-05-08
?
阿晨1998

TA贡献2037条经验 获得超6个赞

您提供的示例程序纯属巧合。如果正确的值 9 是切片中的第一个,则根本不会有输出。


有多种方法可以达到识别最小int的目的(还有更多的方法):


func smallestOfCopyWithSort(in []int) int {


  // Make a copy, so we do not have to modify the original slice.

  // Note: Do NOT use this approach, it is here only for completeness.

  copy := append([]int(nil), in...)

  sort.Ints(copy)

  return (copy[0])

}


func smallestWithSort(in []int) int {

  // Sort the slice.

  // Note that it will be modified and you

  // need to make sure that it will always

  // be sorted, even when you add new values.

  sort.Ints(in)

  return (in[0])

}


func smallestWithMattsApproach(in []int) int {

  smallest := in[0]            // set the smallest number to the first element of the list


  for _, num := range in[1:] { // iterate over the rest of the list

    if num < smallest { // if num is smaller than the current smallest number

      smallest = num // set smallest to num

    }

  }


  return smallest

}

@Matt 的方法可能是最好的方法,因为它非常快,无需修改原始切片。这实际上取决于您想要实现的目标。这里有一些基准


$ go test -test.benchmem -bench=. -test.cpu 1,2,4 -test.benchtime=10s

goos: darwin

goarch: amd64

pkg: <redacted>

BenchmarkSortWithCopy          5000000       345 ns/op       160 B/op          2 allocs/op

BenchmarkSortWithCopy-2        5000000       354 ns/op       160 B/op          2 allocs/op

BenchmarkSortWithCopy-4        5000000       352 ns/op       160 B/op          2 allocs/op

BenchmarkMattsApproach       100000000      15.1 ns/op         0 B/op          0 allocs/op

BenchmarkMattsApproach-2     100000000      15.1 ns/op         0 B/op          0 allocs/op

BenchmarkMattsApproach-4     100000000      15.2 ns/op         0 B/op          0 allocs/op

BenchmarkSort               2000000000      0.00 ns/op         0 B/op          0 allocs/op

BenchmarkSort-2             2000000000      0.00 ns/op         0 B/op          0 allocs/op

BenchmarkSort-4             2000000000      0.00 ns/op         0 B/op          0 allocs/op

毫不奇怪,smallestOfCopyWithSort如果多次调用,它比其他方法慢几个数量级。


Matts 的方法非常快,不会复制或修改任何内容。


但是,如果您需要多次访问最小数量的切片,则对切片进行排序(升序)并简单地访问第一个成员会更高效。这样做的原因是切片将被修改为排序顺序。但是,这种方法有一个警告:您要么在向切片添加值时非常小心,要么在每次修改它时都使用它,这可能会抵消性能优势,具体取决于您的读取和写入比率/从切片。就个人而言,我发现smallestWithSort我最常使用的解决方案,因为我正在使用的切片通常不会改变。


结论

如果您只需要访问最小的数字一次或者切片值的顺序很重要,请使用 Matt 的方法。如果顺序无关紧要并且您需要多次访问最小的数字,您可能应该使用smallestWithSort,同时牢记约束条件。


查看完整回答
反对 回复 2023-05-08
?
qq_笑_17

TA贡献1818条经验 获得超7个赞


for i, num := range x {

        if num < i {

            fmt.Println(num)

        }

    }

这里,i代表索引,num代表价值。因此,您的if条件表示值小于索引然后打印该值。因为,9 值是 9,索引是 14。所以它打印 9,这不是你想要的。


查看完整回答
反对 回复 2023-05-08
?
富国沪深

TA贡献1790条经验 获得超9个赞

返回python中列表的最小数量


def find_smallest_number(input_list):

    d=[]

    for num in input_list:

        for i in numbers:

            if num<i:

                if d==[]:

                    d.append(num)

                else:

                    for j in d:

                        if j>num:

                            d.remove(j)

                            d.append(num)

    return d


查看完整回答
反对 回复 2023-05-08
  • 4 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信