蚂蚁笔试9.15(Golang)

T1
一个b可以分裂为2个a,一个c可以分裂为两个b,以此类推
输入n(1<n<1000),表示a的个数,求最短可以分裂为n个a的字符串  AC

func Test1() {
	m := 0
	fmt.Scan(&m)
	count:= []int{1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024}
	res := make([]byte, 0)
	index := len(xy) - 1
	for m > 0 {
		for j := 0; j < m/count[index]; j++ {
			res = append(res, byte('a'+index))
		}
		m %= count[index]
		index--
	}
	fmt.Println(string(res))
}


T2
编号为1的根节点,所有节点的权值默认为1,每次操作可以将以某个节点为根节点的子树全部节点权值+1,求让每个节点权值等于其编号的最小操作数
这个题目感觉如果树是1-3-2就无解,思考许久,不知道是不是我理解错了
func Test2() {
	m := 0
	fmt.Scan(&m)
	edgs := make([][]int, m)
	for i := 0; i < len(edgs); i++ {
		edgs[i] = make([]int, 0)
	}
	for i := 0; i < m-1; i++ {
		f, t := 0, 0
		fmt.Scan(&f)
		fmt.Scan(&t)
		f--
		t--
		edgs[f] = append(edgs[f], t)
		edgs[t] = append(edgs[t], f)
	}
	queue := make([]int, 0)
	flags := make([]bool, m)
	flags[0] = true
	queue = append(queue, 0)
	var res int64 = 0
	for len(queue) != 0 {
		size := len(queue)
		for i := 0; i < size; i++ {
			poll := queue[0]
			for j := 0; j < len(edgs[poll]); j++ {
				if !flags[edgs[poll][j]] {
					if edgs[poll][j] > poll {
						res += int64(edgs[poll][j] - poll)
					}
					flags[edgs[poll][j]] = true
					queue = append(queue, edgs[poll][j])
				}
			}
			queue = queue[1:]
		}
	}
	fmt.Println(res)
}



T3
题目:输入一个字符串,求其中只有一个字母出现奇数次的子串数目,比较经典的hashmap以及前缀应用题了,AC。
思路:以整数count(表示从0-i子串的前缀)的每一个二进制位标识在该字串中a-z每个字母出现的次数是奇数还是偶数,如果当前位为0,表示出现偶数次(包括0次),如果为1,表示出现奇数次。
例如count=6:110 表示a出现偶数次,b出现奇数次,c出现奇数次。

后续通过翻转count的每一位,来计算有多少个该位所表示的字母出现奇数的情况。
例如count=6:110,翻转第一位 111,此时110对比111的子串来说,就相当于多了一个a,表示a出现了奇数次,其他的字母出现偶数次(包括0次)
func Test3() {
	str := ""
	fmt.Scan(&str)
	hash := make(map[int]int, 0)
	count := 0
	var res int64 = 0
	hash[0] = 1
	for i := 0; i < len(str); i++ {
		count = count ^ (1 << (str[i] - 'a'))
		for j := 0; j < 26; j++ {
			temp := count ^ (1 << j)
			if v, ok := hash[temp]; ok {
				res += int64(v)
			}
		}
		hash[count]++
	}
	fmt.Println(res)
}




#蚂蚁笔试#
全部评论
T3 “后续通过翻转count的每一位,来计算有多少个该位所表示的字母出现奇数的情况。”是啥意思
点赞 回复 分享
发布于 2022-09-15 21:58 广东
第三题前缀和用的很巧妙,大佬可以推荐一些类似的leetcode题目吗?
点赞 回复 分享
发布于 2022-09-16 22:46 山东

相关推荐

11-24 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
尊尼获获:闺蜜在哪?
点赞 评论 收藏
分享
12 16 评论
分享
牛客网
牛客企业服务