蚂蚁笔试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 浙江
有没有大佬帮忙看一下为什么第二题是百分之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 山东
我这题是啥也没写出来
点赞 回复 分享
发布于 2022-09-22 16:20 山东
大佬第二题可以贴下么
点赞 回复 分享
发布于 2022-09-22 14:33 辽宁
同样 我也是回溯 可是超时了 然后卡了个阈值 超过了直接输出-1 骗了百分之三十三
点赞 回复 分享
发布于 2022-09-22 13:08 北京
第二题有没有大佬贴个代码
点赞 回复 分享
发布于 2022-09-22 12:50 广东
好像只有n模4等于3的时候有解
点赞 回复 分享
发布于 2022-09-22 11:29 北京
第三题你过了多少呀
点赞 回复 分享
发布于 2022-09-22 11:18 美国
我也是这个思路,大佬过了多少
点赞 回复 分享
发布于 2022-09-22 11:17 北京

相关推荐

各位前辈好,先说声抱歉,可能又是一篇“求骂醒”的帖子,但我真的需要一个方向。我的情况比大多数人都糟糕:双非软件工程,大四,马上毕业了,0实习经历,0工作经验。秋招根本没参加,原因很傻——我一头扎进了一个自己觉得“挺有意思”的项目里,天真的以为把项目做好工作自然会找上门。现在春招也快结束了,我才如梦初醒,发现简历投出去基本石沉大海。我没有什么能拿出手的背景,唯一能说的就是这个从后端到前端全栈独立开发的电影推荐平台。我知道在各位前辈眼里这大概率就是个小玩具,但我确实是下了功夫去琢磨的,它不是什么网上扒的代码,下面这些是我自己琢磨并落地的东西:项目概况:Spring&nbsp;Boot&nbsp;+&nbsp;MyBatis-Plus&nbsp;+&nbsp;Redis&nbsp;+&nbsp;JWT&nbsp;+&nbsp;MySQL&nbsp;+&nbsp;Vue3(前端是AI辅助生成的)我自己觉得花了心思的几个点:1.&nbsp;推荐算法落地:没有照搬别人的推荐逻辑。我是基于用户多维行为数据(评分、收藏、浏览时长)去计算标签权重,然后用“评分×log(热度+1)”的公式做加权排序;冷启动场景用热门数据兜底。推荐结果用Redis的ZSet缓存,用户行为一变化就主动删缓存触发重算。2.&nbsp;缓存体系设计:不是那种“面试八股文背完就扔”的表面理解。我实际遇到了缓存穿透和击穿的问题,然后自己用空值缓存+逻辑过期去解决。热门电影定时预热、批量查询用multiGet减少IO次数,还封装了MyCacheUtils通用模板,让整个项目其他模块也能复用这套缓存逻辑。3.&nbsp;并发与一致性:用Redis的SET&nbsp;NX&nbsp;EX实现了收藏/点赞的分布式锁,key精确到“用户+操作对象”级别,不是粗粒度的一锁全锁。异常回滚时Redis和MySQL数据一致性问题也思考并落地了。验证码的原子性校验用了Lua脚本来保证。4.&nbsp;性能是真实数据:我用JMeter做了2000并发的压测,引入Redis缓存体系后,推荐接口平均响应从6466ms降到155ms,吞吐量翻了一倍,缓存命中率干到98%以上。这些数据不是编的,是我自己反复调优跑出来的。说实话,做完这些的时候,看着压测报告我是挺兴奋的,觉得“这也算出活儿了吧”。但现实是,0实习好像成了我简历上的原罪,很多公司直接筛选条件就把我过滤了。所以我想跪求各位前辈指点我几个问题,每一条我都认真看、认真执行:1.&nbsp;关于简历:0实习的应届生,还有资格谈“项目亮点”吗?我这项目,是不是在专业面试官眼里就是一个“低配版培训项目”?如果这个项目还有救,该怎么在简历上呈现,才能让HR或者面试官至少愿意给我一个电话面试?如果没有,一个0实习的应届生到底该在简历上写什么?2.&nbsp;关于面试:如何用项目细节证明“我虽然没实习但真的能干活”?我挺怕面试官看到我没有实习经历就直接失去兴趣。真到了面试那一步,我该怎么引导对话,用上面这些技术细节去对抗“没实习=没工程经验”的刻板印象?比如缓存那块,怎么从“我解决了击穿”讲出一个有技术判断力和工程思维的完整故事?3.&nbsp;关于求职策略:错过了黄金窗口期,现在该冲什么样的公司?大厂我肯定不奢望了。现在这个时间点,我应该去投那些小公司和外包吗?要不要把薪资预期降到最低先入行再说?对于0实习的应届生,什么样的公司是真的有机会让我进去学技术、积累经验的?4.&nbsp;关于未来:如果现在直接找不到工作,我该怎么办?这段时间我想好了,如果实在是找不到研发岗,我要不要去干测试或者运维先入行?还是找家小公司被压榨一年攒个经验?还是干脆先找个其他工作边干边学等下一轮秋招?我什么建议都能接受。我知道自己起步晚了,代价得自己扛。现在唯一能做的就是面对现实,然后找到一条最有可能逆袭的路。希望前辈们能给我指个方向,即使简单几句“没救了”或者“还能救,去做XXX”我都非常感激。
jiestart:这简历肯定没面试的,你得包装个实习再加一个agent项目才有希望
点赞 评论 收藏
分享
评论
6
22
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务