蚂蚁笔试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)

}


#蚂蚁集团##蚂蚁笔试##秋招#
全部评论
第三题就模拟,第一行先奇 奇 偶 偶 奇 奇。。。 然后以后每一行通过上一行左移一位,最后一个数特判一下,就能构造出来。
10 回复 分享
发布于 2022-09-22 14:06 北京
第二题字符串截取方案,可以用滑动窗口优化到O(n)复杂度
6 回复 分享
发布于 2022-09-22 15:13 广东
第三题我是纯找规律,首先确定构造矩阵只关心奇数和偶数的个数,题目要求是2*2的子矩阵和全是奇数,那可以假设每两行的分布规律都是相同的,对n是奇偶分情况讨论:n为偶数时,进一步构造,可以发现2,6,10都是没有可行解的,所以对于(n%2==0 && n%4!=0)的n可以直接输出-1 (从测例来看,只有这种情况是没有可行解的,这一点不知道怎么充分证明,欢迎讨论);n为奇数时,进一步构造n=5,7,9的情况,与n=3的分布对比,可以发现一个可行的办法是第一行左右两边交替补充奇/偶数,第二行左边补充奇数,右边补充偶数,剩下的每两行都和前两行相同即可。 如果不找规律的话,可以枚举前两行的可行解,然后按相同规律填充剩下的行即可,无需枚举整个矩阵。
4 回复 分享
发布于 2022-09-22 15:17 广东
第三题我差一点点就写完了。。虽然我知道写完也肯定超时,,,第二题浪费我太多时间了。。一直调试,烦死了
3 回复 分享
发布于 2022-09-22 12:28 浙江
我也是这个思路,大佬过了多少
点赞 回复 分享
发布于 2022-09-22 11:17 北京
第三题你过了多少呀
点赞 回复 分享
发布于 2022-09-22 11:18 美国
好像只有n模4等于3的时候有解
点赞 回复 分享
发布于 2022-09-22 11:29 北京
第二题有没有大佬贴个代码
点赞 回复 分享
发布于 2022-09-22 12:50 广东
同样 我也是回溯 可是超时了 然后卡了个阈值 超过了直接输出-1 骗了百分之三十三
点赞 回复 分享
发布于 2022-09-22 13:08 北京
大佬第二题可以贴下么
点赞 回复 分享
发布于 2022-09-22 14:33 辽宁
我这题是啥也没写出来
点赞 回复 分享
发布于 2022-09-22 16:20 山东
有没有大佬帮忙看一下为什么第二题是百分之50 #include<iostream> #include<string> using namespace std; int main(){     string goal;    cin>>goal;     string num;    cin>>strnum;     int cnt = 0;     for(int i = 1;i < strnum.length();i++){         cnt += goal.length() - i + 1;     }     //cout<<cnt<<endl;     if(goal.length()<strnum.length()){         cout<<cnt<<endl;         return 0;     }     for(int i = 0;i <= goal.length()-strnum.length();i++){         int flag = 0;         for(int j = 0;j < strnum.length();j++){             if(strnum[j] == goal[i+j])  continue;             if(strnum[j] > goal[i+j]){                 flag = 1;                 break;             }             if(strnum[j] < goal[i+j]){                 break;             }         }         cnt += flag;     }     cout<<cnt<<endl;     return 0; }
点赞 回复 分享
发布于 2022-09-23 09:01 山东

相关推荐

杨柳哥:这不是普通人,那这个钱的是天才
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-24 20:55
阿里国际 Java工程师 2.7k*16.0
程序员猪皮:没有超过3k的,不太好选。春招再看看
点赞 评论 收藏
分享
6 22 评论
分享
牛客网
牛客企业服务