20220327-华为OD机试
第一题:正方形个数
第一行输入N,表示下面要输入多少个坐标
往后的N行输入x y坐标,空格隔开。
问,输入的N个坐标中能组成多少个正方形。
输入
3
0 0
1 2
3 1输出
0 (3个点一定构不成一个正方形)
输入
4
0 0
1 2
3 1
2 -1输出
1
第二题:分苹果
有A,B两个同学想要分苹果。A的想法是使用二进制进行,1 + 1相加不进一位,如(9 + 5 = 1001 +101 = 12)。B同学的想法是使用十进制进行,并且进一位。 会输入两组数据,一组是苹果总数,一组分别是每个苹果的重量。如果让B同学在满足A同学的情况下获取到苹果的总重量且返回,如果不能则返回-1。输入
3
3 5 6
输出
11解释:按照A同学的想法 5 + 6 = 3 (101 + 110 = 010)
思路可以参考这个帖子的评论:华为OD机试题蒙蔽求解
第三题 转骰子
骰子是一个正方体,每个面有一个数字,初始为左1,右2,前3,后4,上5,下6,用123456表示这个状态,放置在平面上,可以向左翻转(用L表示向左翻转1次);可以向右翻转(用R表示向右翻转1次);可以向前翻转(用F表示向前翻转1次);可以向后翻转(用B表示向后翻转1次);可以逆时针翻转(用A表示向逆时针翻转1次);可以向顺时针翻转(用C表示向顺时针翻转1次)
输入一行指令,输出最后骰子的状态
输入
RL输出
123456解释:骰子向右转一下,再向左转一下,各面结果相当于不变
题解
- 根据图片我们得到:每一个指令,变化的都只有4个面
- 那么我们将初始状态用一个数组表示
int[] status = new int[]{1,2,3,4,5,6},每个下标分别代表左、右、前、后、上、下这几个面的数字。 - 当指令为L时,根据图中规律:前、后两面不动,即:
status[1],status[3]这两个数不变。 - 当指令为L时,根据图中规律:左、上、右、下依次向右移一位,即相对于
status[0],status[4],status[2],status[5]这四个数来说,把这四个当成一个子数组,子数组中的数依次向后移一次。[左,上,右,下] 移动前:[1,5,2,6] 移动后:[6, 1, 5, 2]
- 其余指令类似,根据图中规律,进行类似操作
代码:
import java.util.Scanner;
/**
* @Description
* @Author xiajun
* @Date 2022/3/27
* @Version 1.0
*/
public class Main {
public static void main(String[] args) {
final Scanner sc = new Scanner(System.in);
final String s = sc.nextLine();
// 维护一个状态数组。分别对应左右前后上下6个面的当前值
int[] status = new int[] {1,2,3,4,5,6};
for (int i = 0; i < s.length(); i++) {
switch (s.charAt(i)) {
case 'L':
int t = status[0];
status[0] = status[4];
status[4] = status[1];
status[1] = status[5];
status[5] = t;
break;
case 'R':
int tm = status[5];
status[5] = status[1];
status[1] = status[4];
status[4] = status[0];
status[0] = tm;
break;
case 'F':
int m = status[2];
status[2] = status[4];
status[4] = status[3];
status[3] = status[5];
status[5] = m;
break;
case 'B':
int mt = status[5];
status[5] = status[3];
status[3] = status[4];
status[4] = status[2];
status[2] = mt;
break;
case 'A':
int a = status[0];
status[0] = status[3];
status[3] = status[1];
status[1] = status[2];
status[2] = a;
break;
case 'C':
int c = status[2];
status[2] = status[1];
status[1] = status[3];
status[3] = status[0];
status[0] = c;
break;
}
}
for (int i : status) {
System.out.print(i);
}
}
}
总结
一开始看到这三个题是崩溃的,也忒难了。。。开始试着做,第一题通过率8%,第二题20%,好在第三题一下就找到规律了。还剩一个小时改前两题,最后通过率42%、80%、100%,凑了个322分出来。(内心OS:我也不知道前两题通过率咋上来的,瞎改条件。。。)
1、3题都是找规律的。第一题很慌张没找好规律,硬是求对角线两点之间距离和两对角线斜率相乘,但斜率可能为小数,会导致有些用例算不到。做到最后还是选择比较了邻边长度是否相等&&对角线长度是否相等,但是输入坐标可能顺序不一样,所以用例也没全过,大概是要做个排列。。。
#华为笔试##笔试题目#
查看30道真题和解析