面经|华为机考记录
7515
2023.04.11
2023.04.16
发布于 未知归属地

一共三个题,450分,我只留意到了第三题是200分,前两题多少分没注意看。
先看题,总结放在最后~

第一题:充电站

Java
package huawei.test01;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

/**
 * 20230410晚华为机考第一题
 * <p>
 * 题目:充电站(回溯)
 *
 * 考试时误以为是01背包问题,实际是回溯
 * <p>
 * 给定一个充电站的最大允许功率maxP,找到充电站内所有设备的任意一种组合,使得这组设备的功率和最接近且不超过整个充电站的最大功率
 * <p>
 * 假设设备总数量为n,每台设备都有自身的功率Pi (1 <= i <= n)
 * <p>
 * 充电站内的某一台设备都有自身的功率,功率不一定相同
 * 找到任意一种组合指的是不限定组内的设备数量,即一组内的设备数量为1到n都可以
 * <p>
 * 如果不存在这样的组,比如当所有设备的功率均大于maxP时,不存在这样的组,返回0
 *
 * 测试用例:输入 4 20 20 50 60 90  输出90
 */
public class t1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            list.add(in.nextInt());
        }
        int maxP = in.nextInt();
        List<Integer> filtedList = list.stream().filter(x -> x <= maxP).collect(Collectors.toList());
        int[] ans = new int[]{0};
        resolve(filtedList, ans, 0, 0, maxP);
        System.out.println(ans[0]);
    }

    private static void resolve(List<Integer> filtedList, int[] ans, int curIndex, int curP, int maxP) {
        if (curIndex >= filtedList.size()) {
            if (curP <= maxP && curP > ans[0]) {
                ans[0] = curP;
            }
            return;
        }
        if (curP > maxP) {
            return;
        } else if (curP == maxP) {
            ans[0] = curP;
            return;
        } else if (curP > ans[0]){
            ans[0] = curP;
        }

        // 选择
        curP += filtedList.get(curIndex);
        // 进入下一个
        resolve(filtedList, ans, curIndex + 1, curP, maxP);
        // 撤销选择
        curP -= filtedList.get(curIndex);

        // 不选进入下一个
        resolve(filtedList, ans, curIndex + 1, curP, maxP);
    }
}

第二题:最长距离

Java
package huawei.test01;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * 20230410晚华为机考第二题
 * <p>
 * 题目:找到相同数字间的最大距离
 * <p>
 * 一排数字,找到相同数字之间最长的间距,不存在任何一组相同数字则返回-1
 *
 * 测试案例:7 4 5 6 2 3 4 8  输出 5
 */
// 通过率100%
public class t2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = in.nextInt();
        }
        Map<Integer, Integer> firstPos = new HashMap<>();
        int distance = -1;
        for (int i = 0; i < n; i++) {
            Integer firstPosOrDefault = firstPos.getOrDefault(nums[i], -1);
            if (firstPosOrDefault == -1) {
                firstPos.put(nums[i], i);
            } else {
                distance = i - firstPosOrDefault;
            }
        }
        System.out.println(distance);
    }
}

第三题:字符串解压缩

Java
package huawei.test01;

import java.util.Scanner;
import java.util.Stack;

/**
 * 20230410晚华为机考第三题
 * <p>
 * 题目:解压缩
 * <p>
 * 解法跟求解逆波兰表达式类似
 * <p>
 * 三种规则:
 * 规则一:形如A3,解压为AAA,单个字符后直接跟数字
 * 规则二:形如{AB}2,解压为ABAB,括号内为字符串,括号外带数字
 * 规则三:形如{A3B1{C}2}3,解压为AAABCCAAABCCAAABCC,括号嵌套
 * <p>
 * 区分大小写
 * 数字可能存在多位数 (一开始没有考虑这一点导致通过率只有20%)
 * <p>
 * 测试用例:输入 {A3B1{C}2}3  输出 AAABCCAAABCCAAABCC
 * 输入 {A3B12{C}2}3  输出 AAABBBBBBBBBBBBCCAAABBBBBBBBBBBBCCAAABBBBBBBBBBBBCC
 */
public class t3 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String compressedString = in.nextLine();
        char[] charArray = compressedString.toCharArray();
        Stack<String> stack = new Stack<>();
        String num = "";
        for (int i = 0; i < charArray.length; i++) {
            char curChar = charArray[i];
            if (curChar == '{' || curChar == '}') {
                stack.push(String.valueOf(curChar));
            } else if (isAlphabeta(curChar)) {
                stack.push(String.valueOf(curChar));
            } else if (isNumber(curChar)) {
                num = num + curChar;
                // 如果下一位还是数字,则先跳过
                if (i < charArray.length - 1 && isNumber(charArray[i + 1])) {
                    continue;
                }
                if (stack.peek().length() == 1 && !stack.peek().equals("}")) {
                    String pop = stack.pop();
                    StringBuilder sb = new StringBuilder();
                    for (int j = 0; j < Integer.parseInt(num); j++) {
                        sb.append(pop);
                    }
                    stack.push(sb.toString());
                } else if (stack.peek().length() == 1 && stack.peek().equals("}")) {
                    stack.pop();
                    StringBuilder sb = new StringBuilder();
                    while (!stack.peek().equals("{")) {
                        sb.insert(0, stack.pop());
                    }
                    stack.pop();
                    String temp = sb.toString();
                    for (int j = 1; j < Integer.parseInt(num); j++) {
                        sb.append(temp);
                    }
                    stack.push(sb.toString());
                }
                num = "";
            } else {
                stack.push(String.valueOf(curChar));
            }
        }
        System.out.println(stack.pop());
    }

    private static boolean isNumber(char curChar) {
        return curChar >= '0' && curChar <= '9';
    }

    private static boolean isAlphabeta(char curChar) {
        return curChar >= 'a' && curChar <= 'z' || curChar >= 'A' && curChar <= 'Z';
    }
}

总结:

1、在力扣刷题会很大程度提高华为机考的通过能力,基本上刷个两三百题我觉得应该就能够去参加考试了
2、考试难度整体一般,第二题基本秒了,难点在于读懂题目意思,分清楚考的是什么算法,针对性编码就可以解决题目,同时,需要重点注意的是,提交后,只会提示测试案例通过率百分之多少,不会提示什么样的案例没有通过或者没有全部通过的原因,此时只能自己盲猜是为啥没有全部通过,不会像力扣这样给出未通过的原因然后可以针对性完善代码。
3、参加机考完,半年内不能再参加机考
4、这次没有考到动态规划,但是最好还是有所准备,把各种算法都练习一下,以防万一
5、题目没有一个是官方给的练习题库中的,看着感觉都是新题,感觉题目描述不是很清晰具体,比如说第三题就没有说输入的字符都是什么样的字符,是只有字母还是也包括其他特殊字符,所以第三题我看不出来为啥只通过了20%,感觉解题过程没啥问题(ps:感谢大佬指点,第三题数字存在多位数的情况没有考虑,导致通过率只有20%)
6、另外就是,之前一直没有参加力扣周赛,通过这次考完,感觉参加周赛要是很有助于参加考试的,可以适应一下那个考试氛围和感觉,不容易紧张,也更加能够保持清晰的思路吧,不会像我第一题上来就会错意了,归根到底还是01背包概念不清晰吧,有点可惜,考完后才醒悟过来是用回溯来写,动态规划一直掌握不够,后期好好努力学吧
7、最后,近期看到力扣的学习区有一些算法leetbook,看了一波,感觉还是不错的,虽然有的比较粗糙吧,但是有的还是挺详细的,可以拿来好好学习,开个会员也算是物有所值了吧,心疼我的钱...
8、想起来,华为机考可以跳出考试页面使用本地IDE编写和调试程序哦,非常友好
9、最后的最后,华为机考不像力扣,是需要自己接收输入,打印输出

补充:
1、参加完两次周赛之后感觉机考的难度跟周赛前三题的难度差不多,周赛前三题能AC的话,通过机考应该也没啥问题
2、周赛:不通过的案例会给出来然后可以调试,同时也会罚时,可以根据不通过的案例调试程序,最后可以争取AC
3、机考:不通过的测试案例不会给出来,就会让人抓瞎,但是不会有罚时,如果自己想不到还有什么案例没有覆盖到,那就做不出来了

番外:

字节算法题感悟:
考了二分搜索,是力扣的原题,33. 搜索旋转排序数组,难度咋样各位可以自己判断哦
字节给了一个页面,里面自带编辑器,可以运行代码,我没有问面试官能不能使用本地IDE,下回再问问看
最后,不知道是不是字节都是面试最后一个环节考算法,被问了一堆问题和项目之后,到最后才让开始写算法题,那会人都已经麻了

ebay算法题感悟:
面试一开始,上来给了一个题,那会是两年前参加的算法面试了,考的力扣原题,1. 两数之和
虽然题目简单,但是编码是真的困难啊,白板编程(相当于在txt文本里编写代码,还需要能自己debug运行起来的那种),api忘了还被面试官笑话了...可怜

以上仅供参考,谢谢~

评论 (56)