当前位置: 首页 > 面试经验 >

蚂蚁笔试go 9-22

优质
小牛编辑
82浏览
2023-03-28

蚂蚁笔试go 9-22

蚂蚁前两道笔试题送分题,很快就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)

}


#蚂蚁集团##蚂蚁笔试##秋招#
 类似资料: