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))
	}

}





#京东##Java工程师##笔经#
全部评论
还有hc?hr面后挂等着呢😂
点赞 回复 分享
发布于 2021-09-16 09:52

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
3
7
分享
牛客网
牛客企业服务