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
解释:骰子向右转一下,再向左转一下,各面结果相当于不变

题解
图片说明

  1. 根据图片我们得到:每一个指令,变化的都只有4个面
  2. 那么我们将初始状态用一个数组表示int[] status = new int[]{1,2,3,4,5,6},每个下标分别代表左、右、前、后、上、下这几个面的数字。
  3. 当指令为L时,根据图中规律:前、后两面不动,即:status[1],status[3]这两个数不变。
  4. 当指令为L时,根据图中规律:左、上、右、下依次向右移一位,即相对于status[0]
    status[4]status[2]status[5]这四个数来说,把这四个当成一个子数组,子数组中的数依次向后移一次。
        [左,上,右,下]
    移动前:[1,5,2,6]
    移动后:[6, 1, 5, 2]
  5. 其余指令类似,根据图中规律,进行类似操作

代码:

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题都是找规律的。第一题很慌张没找好规律,硬是求对角线两点之间距离和两对角线斜率相乘,但斜率可能为小数,会导致有些用例算不到。做到最后还是选择比较了邻边长度是否相等&&对角线长度是否相等,但是输入坐标可能顺序不一样,所以用例也没全过,大概是要做个排列。。。

#华为笔试##笔试题目#
全部评论
咋能把题保存下来呢?
2 回复 分享
发布于 2022-03-30 10:21
第二题考异或,把苹果的所有重量全部异或结果为0,可以分😁
2 回复 分享
发布于 2022-03-28 10:10
看着好难😢
1 回复 分享
发布于 2022-03-30 23:59
第二题没看懂,第三题是求翻转之后的状态?
1 回复 分享
发布于 2022-03-27 23:12
随手用java写了下,点个赞吧 public class Main{     public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         int all = sc.nextInt();//苹果总数         int[] arr = new int[all];         int i=0;         for (int j = 0; j <all; j++) {             arr[i++]=sc.nextInt();         }         int temp = arr[0];         for (int j = 1; j < arr.length; j++) {             temp=temp^arr[j];         }         Arrays.sort(arr);         int res = arr[0];         String s = Integer.toBinaryString(res);         if (temp!=0){             System.out.println("-1");         }else {             System.out.println(s);         }     } }
5 回复 分享
发布于 2022-03-28 22:23
Java第三题
点赞 回复 分享
发布于 2022-07-27 12:02
需要华为机试题库私聊
点赞 回复 分享
发布于 2022-05-08 21:37
祝楼主后续应聘顺利通过~ 借楼宣传,base杭州,欢迎感兴趣的朋友私聊~ https://www.nowcoder.com/discuss/846883?source_id=profile_create_nctrack&
点赞 回复 分享
发布于 2022-04-01 09:20
这是华为od还是校招
点赞 回复 分享
发布于 2022-04-01 00:08
od怎么投?
点赞 回复 分享
发布于 2022-03-31 13:12
第三题,最后按哪个角度将筛子的顺序输出呢
点赞 回复 分享
发布于 2022-03-30 18:45
请问输入输出是自己处理吗?ACM模式?
点赞 回复 分享
发布于 2022-03-30 15:13
有意入职 华为 的同学看过来, 华为 od,社招,21,22应届留学生,博士均可找我内推,面试流程全程跟进。微信:h359767。 【岗位】软件开发工程师(通用软件,底层软件),AI工程师, 算法工程师 (媒体 算法 、软件 算法 、通信 算法 等)
点赞 回复 分享
发布于 2022-03-30 15:05
OD请加vx yy111223666
点赞 回复 分享
发布于 2022-03-30 11:04
// 第一题求正方形个数,这样能过吗,不知道有没有考虑全 字数限制,只能贴图了
点赞 回复 分享
发布于 2022-03-29 12:01

相关推荐

03-03 23:12
已编辑
北京邮电大学 Java
书海为家:我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
你的简历改到第几版了
点赞 评论 收藏
分享
评论
24
138
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务