2575. 找出字符串的可整除数组(Go语言)

https://leetcode.cn/problems/find-the-divisibility-array-of-a-string/

  • 在看题解之前,我的代码是以下这样:
go 复制代码
package main

import (
	"fmt"
)

func main() {
	fmt.Println(divisibilityArray("998244353", 3))
}

func divisibilityArray(word string, m int) []int {
	result := make([]int, len(word))
	sum := 0
	for i, num := range word {
		sum = sum*10 + int(num-'0')
		//fmt.Println(sum)
		if sum%m == 0 {
			result[i] = 1
		} else {
			result[i] = 0
		}
	}
	return result
}
  • 在运行时,会卡在当前数据上,看逻辑,总觉得没有问题,但会出现如此结果,只好去翻看官解,官方的答案思路如下:
go 复制代码
func divisibilityArray(word string, m int) []int {
	result := make([]int, len(word))
	sum := 0
	for i, num := range word {
		sum = (sum*10 + int(num-'0'))%m
		//fmt.Println(sum)
		if sum == 0 {
			result[i] = 1
		} else {
			result[i] = 0
		}
	}
	return result
}
  • 从代码上看,区别在if里面去%求余和在sum计算时求余的区别,后来在单步执行的时候,猛然发现其中的区别:
  • 第一个代码中,sum在每次循环中都被累加,只有在进行条件判断时才对m取模。这意味着sum的值可能会迅速增长,尤其是当word表示一个非常大的数时。这种方法的缺点是,如果word足够长,就可能导致sum变量溢出(超过Go语言整数类型可以表示的最大值),从而导致错误的结果。
  • 第二个代码中,每次循环迭代都会先计算(sum*10 + int(num-'0')),然后立即对m取模来更新sum。这种方法的优点是sum的值永远不会超过m的值,有效避免了整数溢出的问题,尤其是当处理非常大的数字时。这也意味着即使是非常长的word字符串,这段代码也能正确运行而不会因为整数溢出而失效。

总结

  • 第一个方法在进行模运算之前允许sum增长,可能会在处理非常大的数字时遇到整数溢出问题。
  • 第二个方法通过在每次迭代中立即对m取模来避免整数溢出,使得算法对于任意长度的输入都是安全的。
  • 因此,第二个方法更健壮,特别是当处理大数或者不确定输入大小时。
相关推荐
wangbing11252 分钟前
springboot应用关闭时触发动作
java·spring boot·后端
weixin_460443563 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
子兮曰4 小时前
把 649 种文件格式塞进一个网页里:一个「文件不出浏览器」的预览器
前端·javascript·后端
全栈弄潮儿6 小时前
Python实战第2期: 变量与数据类型
后端·python·agent
Cc.Y6 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
启观川7 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸7 小时前
排序算法介绍
python·算法·排序算法
阿森_dev7 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
by209997 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态