一共三个题,450分,我只留意到了第三题是200分,前两题多少分没注意看。
先看题,总结放在最后~
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);
}
}
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);
}
}
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忘了还被面试官笑话了...可怜