蚂蚁前两道笔试题送分题,很快就ac了,
但第三道不知道怎么优化,只会很笨的回溯方法,把n*n的数字填满之后然后判断是不是符合规定,当n很大的时候肯定跑不过
中间也尝试过不等n*n二维数组填满的时候就判断是否符合要求,但折腾了折腾白折腾
附上第三题题目,之前力扣上也刷过类似于解数独的题目 [37. 解数独]
小红构造n行n列矩阵,2*2的举矩阵之和都为奇数
示例1:
输入
3
输出
1 3 2
7 4 6
9 5 8
示例2:
输入
2
输出
-1
package main
import (
"fmt"
)
func main() {
test003()
}
//数字是 1到 n*n
//每个 2*2 矩阵中四个元素之和为 奇数
//有多解时候,输出一个就好
func test003() {
var n int
fmt.Scan(&n)
//保存结果
result := make([][]int, n)
for i := 0; i < n; i++ {
result[i] = make([]int, n)
}
used := make([]bool, n*n+1)
//每个 2*2 矩阵中四个元素之和为 奇数 则返回true
check := func() bool {
for i := 0; i < n-1; i++ {
var temp int
for j := 0; j < n-1; j++ {
temp = 0
for k := j; k < j+2; k++ {
temp += result[i][k]
temp += result[i+1][k]
}
if temp%2 == 0 {
return false
}
}
}
return true
}
var backtrack func(index int) bool
backtrack = func(index int) bool {
if index == n*n && check() { //当n*n数组填满时,去判断是否符合要求
return true
}
// i,j 表示待填充二维矩阵中的横坐标和纵坐标
i, j := index/n, index%n
//选择列表
for k := 1; k <= n*n; k++ {
if used[k] {
continue
} else {
used[k] = true
result[i][j] = k
//继续填充下一个
if backtrack(index + 1) {
return true
}
//回溯
used[k] = false
result[i][j] = 0
}
}
return false
}
if backtrack(0) {
//存在解则打印解
for i := 0; i < n; i++ {
fmt.Print(result[i][0])
for j := 1; j < n; j++ {
fmt.Print(" ", result[i][j])
}
fmt.Print("\n")
}
} else {
fmt.Println(-1)
}
}
第二题可能大家的题目不太一样,反正我的题目如下:
小红拿到数字串,截取一段小于k,求几种截取方案
样例1:
输入
1234
23
输出
5
然后我就随便写了代码也没优化 多个if可以优化一下...
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
test002()
}
func test002() {
var str string
var k int
fmt.Scan(&str)
fmt.Scan(&k)
ans := 0
strk := strconv.Itoa(k)
for i := 0; i < len(str); i++ {
for j := i; j < len(str); j++ {
temp := str[i : j+1]
if len(temp) < len(strk) {
ans++
continue
}
if len(temp) == len(strk) && strings.Compare(temp, strk) < 0 {
ans++
continue
}
if len(temp) > len(strk) {
break
}
}
}
fmt.Println(ans)
}
#蚂蚁集团##蚂蚁笔试##秋招#