吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 688|回复: 2
收起左侧

[学习记录] 一个问题 为什么多传一个参数与否 运行的结果不一样呢?

[复制链接]
980041382 发表于 2022-6-18 18:20
本帖最后由 980041382 于 2022-6-18 18:49 编辑

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


这是正确版本的代码:
[Golang] 纯文本查看 复制代码
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[mid] < target {
                        left = mid + 1
                } else {
                        right = mid
                }
        }
        if nums[left] == 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[mid] > target {
                        right = mid - 1
                } else {
                        left = mid
                }
        }
        return left
}


这是错误版本的代码:
[Golang] 纯文本查看 复制代码
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[mid] < target {
                        //下一轮的搜索区间是mid+1...right
                        left = mid + 1
                } else {
                        right = mid
                }
        }
        // 退出循环以后不能确定 nums[left] 是否等于 target,因此需要再判断一次
        if nums[left] == 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[mid] > 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
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 10:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表