980041382 发表于 2022-6-18 18:20

一个问题 为什么多传一个参数与否 运行的结果不一样呢?

本帖最后由 980041382 于 2022-6-18 18:49 编辑

两个片段 都是leetcode34题的解法。。。为什么第一版我把数组的长度计算出来传到方法里面就运行正确。。第二版 我直接在方法里面重新计算一下 得到的结果就是错误的呢?


这是正确版本的代码:
package main

func searchRange(nums []int, target int) []int {
      len := len(nums)
      if len == 0 {
                return []int{-1, -1}
      }
      firstPosition := findFirstPosition(nums, target, len)
      //如果开始位置都没有找到目标值 那么肯定就不存在 直接返回即可
      if firstPosition == -1 {
                return []int{-1, -1}
      }
      lastPosition := findLastPosition(nums, target, len)
      return []int{firstPosition, lastPosition}
}

func findFirstPosition(nums []int, target, len int) int {
      left := 0
      right := len - 1
      for left < right {
                mid := left + (right-left)/2
                //判断开始位置
                if nums < target {
                        left = mid + 1
                } else {
                        right = mid
                }
      }
      if nums == target {
                return left
      }
      return -1
}

func findLastPosition(nums []int, target, len int) int {
      left := 0
      right := len - 1
      //判断结束位置
      for left < right {
                mid := left + (right-left+1)/2

                if nums > target {
                        right = mid - 1
                } else {
                        left = mid
                }
      }
      return left
}


这是错误版本的代码:
package main

func searchRange(nums []int, target int) []int {
      len := len(nums)
      if len == 0 {
                return []int{-1, -1}
      }
      firstPositon := findFirstPosition(nums, target, len)
      if firstPositon == -1 {
                return []int{-1, -1}
      }
      lastPostition := findLastPosition(nums, target, len)
      return []int{firstPositon, lastPostition}
}

func findFirstPosition(nums []int, target, len int) int {
      left := 0
      right := len - 1
      if left < right {
                mid := left + (right-left)/2
                //小于一定不是解
                if nums < target {
                        //下一轮的搜索区间是mid+1...right
                        left = mid + 1
                } else {
                        right = mid
                }
      }
      // 退出循环以后不能确定 nums 是否等于 target,因此需要再判断一次
      if nums == target {
                return left
      }
      return -1
}

func findLastPosition(nums []int, target, len int) int {
      left := 0
      right := len - 1

      if left < right {
                mid := left + (right-left+1)/2

                if nums > target {
                        right = mid - 1
                } else {
                        left = mid
                }
      }
      return left
}


太粗心了 golang没有while 用for

980041382 发表于 2022-6-18 18:40

楼主呆了。。for写成if了。。

980041382 发表于 2022-6-18 18:42

本帖最后由 980041382 于 2022-6-18 18:49 编辑

980041382 发表于 2022-6-18 18:40
楼主呆了。。for写成if了。。
入口条件应该用for
页: [1]
查看完整版本: 一个问题 为什么多传一个参数与否 运行的结果不一样呢?