虾皮9.22后端笔试
已经交卷了,尽力了...
题型是10个单选,5个多选,3个编程,选择题难度还可以。
第一道题是字符串匹配,我直接暴力算相似度的,过了80%
第二道题是测试成本,排序完前两项相加可以,加完了再排下序,过了90%
第三道题是背包的最小上限,不会做,骗过了10%
/*
*最小容量
详细描述
有n(1<=n<=100000)件重量为w1,w2...wn (1<=wi<=100000)的物品,小S有m(1<=m<=n)个袋子,每个袋子的容量上限是k。
已知n,w1,w2...wn和m,求最小的k。 小S一定是按w1到wn顺序进行打包。
比如:
n=4
m=2
w1,w2,w3,w4 = 4, 2, 3, 1
其中一种方案:
第一个袋子装 w1和w2,重量是6
第二个袋子装w3和w4,重量是4
所以袋子的容量上限最小是6
*/
func Solve(n int, m int, weights []int) int64 {
var res int64 = -9999
if n%m == 0 {
count := n / m
for i := 0; i < n; i += count {
var temp int64
for j := i; j < i+count; j++ {
temp += int64(weights[j])
}
if temp > res {
res = temp
}
}
}
return res
}
/*
*找出最低的测试成本是多少
详细描述
对于一些大型软件项目来说,通常会将任务拆分为很多小模块定义好接口来进行开发。
测试人员对于每个模块都没计了一些回归测试用例,在开发人员提测后需要对每个模块都执行一下相应模块的测试用例
现在各个子模块都完成了开发,假设有一个要求,每次只能合并两个模块的代码,两个模块合并后,需要执行这两个模块的所有测试用例
请你写一个程序帮忙计算一下这样两两合并并测试,测试人员最小需要执行多少次测试用例。
比如一个项目有三个模块,每个模块对应的测试用例数量分别为 [1, 2, 9]
那么先合并前两个模块,需要执行3个测试用例,然后再将合并后的模块与第三个模块合并再测试需要再执行12个测试用例,总计最少需要执行15个测试用例
其他
时间限制: 1000ms
内存限制: 256.0MB
输入输出示例
示例1
输入
[1,2,9]
输出
15
*/
func minEffort(cases []int) int {
// write code here
// 两两合并
c := cases
var res int
sort.Ints(c)
for len(c) > 1 {
temp := c[0] + c[1]
// fmt.Println(c, temp)
res += temp
c[1] = temp
c = c[1:]
// 重新找到合适的位置
sort.Ints(c)
}
return res
}
/*
*最有可能想要输入的命令
详细描述
给你一个非空字符串数组 commands 用来表示可以执行的候选命令列表,和一个用户误输入的(不在 commands 中)命令字符串 input。
求与用户输入的命令的最佳匹配命令。题目保证只有一个最佳匹配。
最佳匹配是指:通过最少的次数对 input “插入一个字符”或“替换一个字符”或“删除一个字符”使其等于 commands 中的一个。
其他
时间限制: 1000ms
内存限制: 256.0MB
输入输出示例
示例1
输入
["main"],"mian"
输出
"main"
示例2
输入
["server"],"serv"
输出
"server"
示例3
输入
["help","version","status"],"statsu"
输出
"status"
*/
func didYouMean(commands []string, input string) string {
// write code here
// 计算重复字母数量
inputMap := make(map[rune]int)
for _, b := range input {
inputMap[b] = inputMap[b] + 1
}
comMap := make(map[string]map[rune]int)
var res string
var resRatio float64
for _, c := range commands {
comMap[c] = make(map[rune]int)
for _, b := range c {
comMap[c][b] = comMap[c][b] + 1
}
var tempCount int
for k, v := range inputMap {
if count, ok := comMap[c][k]; ok {
if v <= count {
tempCount += v
} else {
tempCount += count
}
}
}
if (float64(tempCount) / float64(len(c))) > resRatio {
// 字母重复率
res = c
resRatio = float64(tempCount) / float64(len(c))
}
}
return res
} 
