
2025-09-11:不同三位偶数的数目。用go语言,给定一个数字列表 digits,从中挑出三个不重复的元素,按百位-十位-个位拼成一个三位数。要求百位不能是 0,个位必须是偶数,每个数组元素最多只能用一次。问能组成多少个不同的满足条件的三位数(相同数值只计一次)。
3 <= digits.length <= 10。
0 <= digits[i] <= 9。
输入: digits = [1,2,3,4]。
输出: 12。
解释: 可以形成的 12 个不同的三位偶数是 124,132,134,142,214,234,312,314,324,342,412 和 432。注意,不能形成 222,因为数字 2 只有一个。
题目来自力扣3483。
根据代码和题目描述,以下是生成所有不同三位偶数的详细过程:
used布尔数组(长度与digits相同)来标记每个数字是否已被使用;创建results集合(使用map[int]bool)来存储唯一的三位数。current长度达到3时,检查百位是否为0(不能为0)和个位是否为偶数(满足条件则将该数字加入results集合)。current。backtrack。current中移除该数字,并标记为未使用。results集合的大小即为唯一三位偶数的数量。totalNumbers并输出结果。used数组:O(n)(n为输入长度,最大10)。results集合:最坏情况下存储所有可能的三位数(最多P(n,3)个,但实际由于去重和条件限制会少一些),因此空间为O(P(n,3)) = O(n^3)(n=10时最多720个,但实际更少)。总结:时间复杂度为O(n^3),额外空间复杂度为O(n^3)。
.
package main
import (
"fmt"
)
func totalNumbers(digits []int)int {
n := len(digits)
used := make([]bool, n)
results := make(map[int]bool)
var backtrack func(current []int)
backtrack = func(current []int) {
iflen(current) == 3 {
if current[0] != 0 && current[2]%2 == 0 {
num := current[0]*100 + current[1]*10 + current[2]
results[num] = true
}
return
}
for i := 0; i < n; i++ {
if !used[i] {
used[i] = true
current = append(current, digits[i])
backtrack(current)
current = current[:len(current)-1]
used[i] = false
}
}
}
backtrack([]int{})
returnlen(results)
}
func main() {
digits := []int{1, 2, 3, 4}
result := totalNumbers(digits)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def totalNumbers(digits):
n = len(digits)
used = [False] * n
results = set()
def backtrack(current):
iflen(current) == 3:
if current[0] != 0 and current[2] % 2 == 0:
num = current[0] * 100 + current[1] * 10 + current[2]
results.add(num)
return
for i in range(n):
if not used[i]:
used[i] = True
current.append(digits[i])
backtrack(current)
current.pop()
used[i] = False
backtrack([])
returnlen(results)
if __name__ == "__main__":
digits = [1, 2, 3, 4]
print(totalNumbers(digits))
我们相信Go语言和算法为普通开发者提供了困境的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的Go语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。 欢迎关注“福大大架构师每日一题”,让 Go 语言和算法助力您的职业发展