LeetCode 3392题解:解析Go与PHP整数除法差异及类型转换陷阱

在学习Go语言的过程中,我遇到了一道LeetCode题目,尝试用PHP和Go分别实现时,发现了两者在处理整数除法时的差异,导致了程序在某些情况下出现问题。以下是我对这一问题的分析与解决方案,希望对正在学习Go语言的朋友们有所帮助。

题目描述:统计符合条件的长度为 3 的子数组数目

题目要求: 给定一个整数数组 nums,请返回长度为 3 的子数组的数量,要求满足第一个数和第三个数的和恰好为第二个数的一半。

子数组指的是一个数组中连续的非空元素序列。

示例 1:

输入:nums = [1,2,1,4,1]

输出:1

解释:只有子数组 [1,4,1] 满足条件,即第一个数和第三个数的和(1 + 1)是中间数的二分之一(4 / 2)。

示例 2:

输入:nums = [1,1,1]

输出:0

解释:唯一的子数组 [1,1,1] 不满足条件,因为第一个数和第三个数的和(1 + 1)并不是中间数的一半(1 / 2)。

PHP和Go代码实现

  • PHP语言实现
class Solution {

    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function countSubarrays($nums) {
        $res_count = 0;
        for($i = 0; $i < count($nums) - 2; $i++) {
            if($nums[$i] + $nums[$i+2] == $nums[$i+1] / 2){
                $res_count++;
            }
        }
        return $res_count;
    }
}
  • Go语言实现
func countSubarrays(nums []int) int {
    count := 0
    for i := 0; i < len(nums)-2; i++ {
        if nums[i] + nums[i+2] == nums[i+1] / 2 {
            count++
        }
    }
    return count
}

从上面的代码可以看出,Go语言和PHP的实现逻辑是一致的,但在某些特定的输入下,程序的行为可能会不同,尤其是在涉及到整数除法时。

关键问题分析:整数除法的规则

问题出现在以下这行代码:

if nums[i] + nums[i+2] == nums[i+1] / 2

当输入为 nums = [-1, -4, -1, 4] 时,结果并不会符合预期。其根本原因在于Go语言中的整数除法规则。

Go语言中的整数除法

在Go语言中,整数除法是向零取整的。这意味着,计算结果会直接舍去小数部分,仅保留整数部分。例如:

package main

import "fmt"

func main() {
    res1 := -1 / 2
    fmt.Println("整数除法结果:", res1) // 输出: 0

    res2 := float64(-1) / 2
    fmt.Println("浮点数除法结果:", res2) // 输出: -0.5
}

因此,在进行整数除法时,-4 / 2 将得到 -2,而不是 -2.0,这导致了在判断条件时,出现了不符合预期的情况。

如何解决?

如果我们想得到更精确的结果,可以将其中一个操作数转换为浮点数。例如:

if float64(nums[i]) + float64(nums[i+2]) == float64(nums[i+1]) / 2.0 {
    count++
}

通过这种方式,我们就能避免整数除法带来的精度问题,从而确保程序在各种情况下都能正确运行。

还有一种解法,就是把除法转换为乘法。

if (nums[i] + nums[i+2]) * 2 == nums[i+1] {
    count++
}

总结

在Go语言中,整数除法是向零取整的,这一点与许多其他编程语言(如Python)有所不同。了解这一点,对于开发者在编写涉及除法运算的程序时至关重要。如果在程序中遇到类似的问题,记得根据需求适当转换数据类型,以确保计算的准确性。

希望这篇文章能够帮助大家更好地理解Go语言中的整数除法规则,并在实际编程中避免类似的问题。如果你在学习Go语言时也遇到了类似的困惑,不妨参考一下这篇文章的思路。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇