是GoLang的新手。因此,每天都会遇到leetcode问题,即要减去整数的乘积和数字总和。为此,我最初考虑将整数拆分为单个数字,然后将所有数字相加/相乘以获得输出。但是无法做到这一点,因为我目前还不太了解类型转换。经过多次试验和错误后,我放弃了这种方法,并使用除法和取模来获取最后的数字并获取输出。这是我所做的:
func subtractProductAndSum(n int) int {
sum, prod := 0, 1
for {
if n < 10 {
sum += n
prod *= n
break
}
sum += n % 10
prod *= n % 10
n = n / 10
}
return prod - sum
}
这有效,但在其他答案中,我发现了一个有效的方法,该方法基于我的第一种方法(拆分和征服):
func subtractProductAndSum(n int) int {
p := 1
s := 0
strN := strconv.Itoa(n)
for _, val := range strN {
intVal := int(val - '0')
p = p * intVal
s = s + intVal
}
return p - s
}
以这种方式,我无法理解intVal := int(val - '0')
。它肯定会获得所需的输出。我认为正在将val
类型转换为int
,但我无法理解 - '0'
有什么帮助。
希望有人可以提供帮助。
答案 0 :(得分:2)
您的strN
包含一个与n
相同的字符串值。 val
中的for loop
变量是character
类型的数据,而不是int
数字,并且绝对不会类型转换为int
。
变量val
可以包含以下任何字符{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
。
因此,如果您从任何数字字符中减去'0'
,您将得到'0'
与实际上是您正在寻找的digit
值的int
之间的差异。
减法基本上是两个字符的ASCII
值之差。
例如,如果从'0'
中减去'5'
,将得到5
,它是整数值。
ASCII
和'5'
的{{1}}值为'0'
和53
。因此,48
实际上是'5' - '0'
,而实际上是53 - 48
。
这是代码中类型转换的工作方式。