【华为笔试题】2022Q2,三道全部AC
第一题:最远足迹
题目描述
某探险队负责对地下洞穴进行探险。 探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的间隙中也会记录其他数据。 探索工作结束后,探险队需要获取到某成员在探险过程中相对于探险队总部的最远的足迹位置。
仪器记录坐标时,坐标的数据格式为(x,y),如(1,2)、(100,200),其中0<x<1000,0<y<1000。同时存在非法坐标,如(01,1)、(1,01),(0,100)属于非法坐标。
设定探险队总部的坐标为(0,0),某位置相对总部的距离为:x * x+ y * y。
若两个座标的相对总部的距离相同,则第一次到达的坐标为最远的足迹。
若记录仪中的坐标都不合法,输出总部坐标(0,0)。 备注:不需要考虑双层括号嵌套的情况,比如sfsdfsd((1,2))。
输入描述
字符串,表示记录仪中的数据。
如:ferga13fdsf3(100,200)f2r3rfasf(300,400)
输出描述
字符串,表示最远足迹到达的坐标
如:(300,400)
public class MaxSteps { public static void main(String[] args) { Scanner cin = new Scanner(System.in); String str = cin.nextLine(); cin.close(); char[] chars = str.toCharArray(); int max = 0; String ans = "(0,0)"; ArrayList<Integer> left = new ArrayList<>(); ArrayList<Integer> right = new ArrayList<>(); for (int i = 0; i < chars.length; i++) { if (chars[i] == '(') { left.add(i); } if (chars[i] == ')') { right.add(i); } } for (int i = 0; i < left.size(); i++) { String[] strs = str.substring(left.get(i) + 1, right.get(i)).split(","); if (strs[0].charAt(0) != '0' && strs[1].charAt(0) != '0') { int x = Integer.parseInt(strs[0]), y = Integer.parseInt(strs[1]), distance = x * x + y * y; if (x < 1000 && y < 1000 && distance > max) { max = distance; ans = String.format("(%s,%s)", x, y); } } } System.out.println(ans); } }
VLAN资源池
题目描述
VLAN是一种对局域网设备进行逻辑划分的技术,为了标识不同的VLAN,引入VLAN ID(1-4094之间的整数)的概念。
定义一个VLAN ID的资源池(下称VLAN资源池),资源池中连续的VLAN用开始VLAN-结束VLAN表示,不连续的用单个整数表示,所有的VLAN用英文逗号连接起来。
现在有一个VLAN资源池,业务需要从资源池中申请一个VLAN,需要你输出从VLAN资源池中移除申请的VLAN后的资源池
输入描述
第一行为字符串格式的VLAN资源池,第二行为业务要申请的VLAN,VLAN的取值范围为[1,4094]之间的整数
输出描述
从输入VLAN资源池中移除申请的VLAN后字符串格式的VLAN资源池,输出要求满足题目描述中的格式,并且按照VLAN从小到大升序输出。
如果申请的VLAN不在原VLAN资源池内,输出原VLAN资源池升序排序后的字符串即可
示例1
输入
1-5 2
输出
1,3-5
示例2
输入
20-21,15,18,30,5-10 15
输出
5-10,18,20-21,30
代码
public class VlanResources { public static void main(String[] args) { Scanner cin = new Scanner(System.in); String vlanResources = cin.nextLine(); Integer vlanApply = cin.nextInt(); cin.close(); TreeSet<Integer> vSet = new TreeSet<>(); String[] vlans = vlanResources.split(","); for (String vlan : vlans) { if (vlan.contains("-")) { String[] nums = vlan.split("-"); int left = Integer.parseInt(nums[0]); int right = Integer.parseInt(nums[1]); for (int i = left; i <= right; i++) { vSet.add(i); } } else { vSet.add(Integer.parseInt(vlan)); } } // 移出已经申请的 vSet.remove(vlanApply); ArrayList<Integer> list = new ArrayList<>(vSet); StringBuilder sb = new StringBuilder(); Integer left = list.get(0); Integer right = left; for (int i = 1; i < list.size(); i++) { Integer value = list.get(i); if (value == right + 1) { right = value; } else { // 添加 build(sb, left, right); left = right = value; } } build(sb, left, right); // 移除最后一个逗号 System.out.println(sb.substring(0, sb.length() - 1)); } private static void build(StringBuilder sb, Integer left, Integer right) { if (left.equals(right)) { sb.append(right).append(","); } else { sb.append(String.format("%s-%s,", left, right)); } } }
第三题:转骰子
骰子是一个立方体,每个面一个数字,初始为左1,右2,前3(观察者方向),后4,上5,下6,用123456表示这个状态。放置在平面上,可以向左翻转(用L表示向左翻转1次),可以向右翻转(用R表示向右翻转1次),可以向前翻转(用F表示向前翻转1次),可以向后翻转(用B表示向后翻转一次),可以逆时针旋转(用A表示逆时针旋转90度),可以逆时针旋转(用C表示顺时针旋转90度),现从123456这个初始状态开始,根据输入的动作序列,计算得到最终的状态
示例1
输入
LR
输出
123456
示例2
输入
FCR
输出
342156
代码
public class RollDice { public static void main(String[] args) { Scanner cin = new Scanner(System.in); String act = cin.nextLine(); cin.close(); // 初始数据,本题的关键,按照输出顺序,构建左右,前后,上下序列 int[][] sz = { {1, 2}, // 左右 {3, 4}, // 前后 {5, 6} // 上下 }; // L: 左翻 (左右互换;上下,左右互换) /** { {5,6}, {3,4}, {2,1} } */ // R: 右翻(上下互换;上下,左右互换) /** { {6,5}, {3,4}, {1,2} } */ // F: 前翻(前后互换;前后,上下互换) /** { {1,2}, {5,6} {4,3} } */ // B: 后翻 (上下互换;前后,上下互换) /** { {1,2}, {6,5}, {3,4} } */ // A: 逆时针旋转90(前后互换;左右,前后互换) /** { {4,3}, {1,2}, {5,6} } */ // C: 顺时针旋转90 (左右互换;左右,前后互换) /** { {3,4}, {2,1}, {5,6} } */ // FCR // F {{1,2},{5,6}{1,2}} for (char c : act.toCharArray()) { if (c == 'L' || c == 'R') { if (c == 'L') { int x = sz[0][0], y = sz[0][1]; sz[0][0] = y; sz[0][1] = x; } else if (c == 'R') { int x = sz[2][0], y = sz[2][1]; sz[2][0] = y; sz[2][1] = x; } int[] p = sz[2]; sz[2] = sz[0]; sz[0] = p; } if (c == 'B' || c == 'F') { if (c == 'F') { int x = sz[1][0], y = sz[1][1]; sz[1][0] = y; sz[1][1] = x; } else if (c == 'B') { int x = sz[2][0], y = sz[2][1]; sz[2][0] = y; sz[2][1] = x; } int[] p = sz[1]; sz[1] = sz[2]; sz[2] = p; } if (c == 'A' || c == 'C') { if (c == 'A') { int x = sz[1][0], y = sz[1][1]; sz[1][0] = y; sz[1][1] = x; } else if (c == 'C') { int x = sz[0][0], y = sz[0][1]; sz[0][0] = y; sz[0][1] = x; } int[] p = sz[0]; sz[0] = sz[1]; sz[1] = p; } } int m = sz.length, n = sz[0].length; StringBuilder sb = new StringBuilder(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { sb.append(sz[i][j]); } } System.out.println(sb); } }
三道题全部AC,总体来说不难,前两道之前做过原题,最后一道题搞清楚变换方向就行了,我觉得有优化的点,但是通过了全部用例,就不管了
#华为##华为笔试##华为od#