9.11京东java工程师笔试
9点考试结束了,现在发应该没问题了
30道选择题,java 比较多,shell 网络 也有一些,没记错的话有一道多选题。
两道算法,不是很难,我直接暴力做都全部ak了,语言是golang。
第一题是键盘排列,走格子,注意下转向成本就行,
第二题是systemd依赖,注意循环处理下间接的依赖就行。
顺便统计下大家的ak情况呗~
/*
*键盘输入
时间限制: 3000MS
内存限制: 589824KB
题目描述:
你在使用一个特殊的键盘输入一个字符串。键盘是一个矩形网格的形状,有各种不同的排列,每个按键上的字符互不相同,最多有 94 个按键(除空格外共有 94 个可见 ASCII 字符,ASCII 码为 33~126)。你需要操作一个机械手来点击这个键盘,机械手可以上下左右移动,每移动一格耗时 x,移动过程中(不包括一开始或者点击前后)转向耗时 y,每次点击键盘耗时 z。一开始,机械手位于左上角。请计算打完这个字符串最少需要多少时间。
输入描述
第一行五个空格隔开的整数 n, m, x, y, z,0 < n * m <= 94,1 <= x, y, z <= 100000
后面 n 行,每行一个由 m 个字符组成的字符串,表示键盘的配列,保证 m 个字符都是 ASCII 可见字符,不是空格且互不相同。
最后一行一个由上述配列中存在的字符组成的字符串,长度不超过 100000。
输出描述
一个整数,表示最少需要的时间
样例输入
2 2 1 1 1
.E
:F
EE:F.:
样例输出
15
提示
步骤拆解
E→2 EE→3 EE: →7(移动中涉及了转向) EE:F→9 EE:F.→13(移动中涉及了转向) EE:F.:→15
*/
package main
import (
"fmt"
"strings"
)
type Pos struct {
X, Y int
}
func main() {
var n, m, x, y, z int
fmt.Scan(&n, &m, &x, &y, &z)
// fmt.Println(n, m, x, y, z)
array := make([][]string, n)
posMap := make(map[string]Pos)
for i := 0; i < n; i++ {
var temp string
fmt.Scan(&temp)
js := strings.Split(temp, "")
array[i] = make([]string, m)
for j := 0; j < m; j++ {
array[i][j] = js[j]
posMap[js[j]] = Pos{i, j}
}
}
// fmt.Println(array, posMap)
var tempX, tempY int
var final string
var res int
fmt.Scan(&final)
for _, s := range strings.Split(final, "") {
target := posMap[s]
var temp int
temp += abs(target.X, tempX) * x
temp += abs(target.Y, tempY) * x
// 需要转向
if (target.X != tempX) && (target.Y != tempY) {
temp += y
}
// 敲击一下
temp += z
res += temp
// fmt.Println("target", target, "tempCost", temp)
tempX, tempY = target.X, target.Y
}
fmt.Println(res)
}
func abs(x, y int) int {
temp := x - y
if temp < 0 {
return (-1) * temp
}
return temp
} /*
* 题目描述
Systemd 依赖
时间限制: 3000MS
内存限制: 589824KB
题目描述:
你可能不喜欢 systemd,但很可能每天都要面对它——Linux 下广泛使用的 init 程序。
在一个 systemd units 中,可以使用 Requires=… 的语法来引入依赖,当服务 a 引入了服务 b 作为依赖之后,服务 a 启动时 b 会随之启动,b 停止时 a 会随之停止。本题会给你 n 个服务和它们之间的依赖关系,一开始所有服务都处于停止状态,然后进行若干次启动和停止操作,你需要在每一次操作后输出当前正在运行的服务数量。假设所有服务都能稳定运行、正常启动和退出。为了简化输入,所有服务名使用序号(1~n)代替。可以启动正在运行的程序,也可以停止已经停止的程序,这样的操作将不会造成任何变化。
输入描述
第一行两个空格隔开的整数 n, q,表示服务的数量和询问的数量,1 <= n, q <= 500。
下面 n 行,其中的第 i 行第一个整数 c 表示第 i 个服务所依赖的服务数量,后面 c 个整数表示它所依赖的各个服务,保证这 c 个整数在 1~n 范围内,互不相等且都不等于 i。
下面 q 行,每行两个空格隔开的整数 x, y。x 为 1 或 0,1 表示启动服务,0 表示停止服务。y 表示启动或停止的服务的序号。
输出描述
q 行,每行一个整数,表示每次操作后这 n 个服务中正在运行的服务数量。
样例输入
3 2
1 2
1 3
0
1 1
0 2
样例输出
3
1
*/
package main
import (
"fmt"
)
func main() {
var n, q int
fmt.Scan(&n)
fmt.Scan(&q)
// fmt.Println(n, q)
// key 依赖的value
depend := make(map[int][]int)
// key为被依赖的
dependReverse := make(map[int][]int)
// key标识服务 value标识是否启动
service := make(map[int]bool)
for i := 1; i <= n; i++ {
//service[i]=false
if len(depend[i]) < 1 {
depend[i] = make([]int, 0)
}
var total int
fmt.Scan(&total)
for ii := 1; ii <= total; ii++ {
var d int
fmt.Scan(&d)
depend[i] = append(depend[i], d)
if len(dependReverse[d]) < 1 {
dependReverse[d] = make([]int, 0)
}
dependReverse[d] = append(dependReverse[d], i)
}
}
// fmt.Println(depend)
// fmt.Println(dependReverse)
for i := 1; i <= q; i++ {
var enable, idx int
fmt.Scan(&enable)
fmt.Scan(&idx)
idxs := []int{idx}
if enable == 1 {
// 启动所有依赖项
for {
if len(idxs) < 1 {
break
}
anothers := make([]int, 0)
for _, iidx := range idxs {
service[iidx] = true
// 依赖的下游也都启动起来
for _, ii := range depend[iidx] {
if service[ii] {
continue
}
service[ii] = true
anothers = append(anothers, ii)
}
}
idxs = anothers
}
} else {
// 停用被依赖项
for {
if len(idxs) < 1 {
break
}
anothers := make([]int, 0)
for _, iidx := range idxs {
if _, ok := service[iidx]; ok {
delete(service, iidx)
}
for _, ii := range dependReverse[iidx] {
if _, ok := service[ii]; !ok {
continue
}
delete(service, ii)
anothers = append(anothers, ii)
}
}
idxs = anothers
}
}
// fmt.Println(service)
fmt.Println(len(service))
}
}
安克创新 Anker公司福利 782人发布
