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

相关推荐

头像
03-31 15:22
已编辑
1&nbsp;二叉平衡树查找二叉平衡树:左右子树高度相差不超过1,相比普通二叉树查找优化在最坏情况的时间效率,普通二叉树最坏情况退化为单链表,时间效率O(n),二叉平衡树最坏log(n)见:https://zhuanlan.zhihu.com/p/56066942二叉平衡树的插入失衡有:LL,RR,LR,RL四种情况,只要调整最小失衡树就行(最小失衡树3层深)对于LL和RR,哪棵树矮旋哪里,直接失衡结点旋。对于LR,左孩子左旋,右孩子右旋;RL右孩子右旋,左孩子左旋。2&nbsp;二叉树的3种遍历先中后取决根节点在啥时候遍历先序遍历:[根]左右中序遍历:左[根]右后序遍历:左右[根]见:https://cloud.tencent.com/developer/article/21344543&nbsp;k堆金币,最多几堆能组合出1~1000随意一个数的金币量每堆金币只有2个状态取和不取也就是0/1,2进制编码,2的10次&nbsp;=&nbsp;1024&amp;gt;1000,所以10堆,每堆2的[0,1,2...,9]次4&nbsp;线程5&nbsp;15台printer,k个进程竞争使用,每个进程最多需要4台printer,可能会发生死锁的最小值是?死锁:资源耗尽,每个进程都执行不了只能等待其它进程释放资源3k&amp;gt;=15&nbsp;K=56虚函数7&nbsp;TCP协议Transmission&nbsp;Control&nbsp;Protocol面向连接、可靠、基于字节流的传输层通信协议TCP协议的允许:连接简历,数据传输,连接终止三次握手过程建立一个连接(客户端请求——服务端回答并请求——客户端回答,然后建立双向通信)https://zh.wikipedia.org/wiki/%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE8&nbsp;MySQL&nbsp;不是考察sql语句,好像是死锁相关https://cloud.tencent.com/developer/article/18395909&nbsp;PBR材质PBR&nbsp;材质是一种基于物理的渲染材质,可提供灯光与曲面交互方式的精确表示。
投递4399游戏等公司10个岗位
点赞 评论 收藏
转发
6 21 评论
分享
牛客网
牛客企业服务