华为社招机考2月23号晚
投的是java开发岗位,机考内容是15道选择题,3道算法题(两道简单,一道困难)。
选择题不说了,懂的都懂。
第一道算法题:(答主100%通过)
给你一个字符串,然后按照它的出现频率由高到低排序,如果频率相同,则按照字典序排列。
例如:
输入 abdeeeea
输出 eeeeaabd
解题思路:先用一个map统计一下出现的char和次数,然后新建一个item对象,实现Comparable接口,复写compareTo方法,进行排序。最后输出的时候注意:一个字符出现多少次,就要打印多少次。
第二道算法题:(答主60%通过)
给你一个十进制小数m(m>0.0000000009 && m<1),再给你一个整数n表示进制(n>1 && n<11),让你把m表示为n进制下的小数,保留十位有效数字。输入有多组数据,当m和n均为0时,结束。
例如:
输入 0.795 3
0 0
输出 0.2101101122
解题思路:这题没做全对,应该是用Math.pow(n, 0.0000000001)进行数值累加时,出现了一些计算偏差,具体看不到未通过的样例,只能交给热心的读者朋友来解决了QAQ
第三道算法题:(答主100%通过)
给你一个n x n的正方形矩阵数组,将它旋转90度得到一个新矩阵,然后打印出来。看到这里,我心想也太简单了,直接线性代数变换就好了。但是,题目最后来了一句,不允许新建一个变换矩阵做叉乘,瞬间把这题从简单题拉到困难。
例如:
输入:
#华为##社招##Java工程师##面经# 3
1 2 3
4 5 6
7 8 9
输出:
7 4 1
8 5 2
9 6 3
8 5 2
9 6 3
解题思路:过程模拟 + 时间换空间。
以3 x 3的矩阵为例,我们考虑单元操作,9挪到7,7挪到1,1挪到3,3挪到9,这就是一个单元转换过程。他们的变换坐标是有一定联系的,具体参考我下面的代码(华为机考是允许ide调试的,所以我的vscode留下了最后一题的代码)
import java.util.*;
/*
four steps
1 2 3 4
3 4 5 6
7 8 9 10
11 12 13 14
2->6
0,1 1,3
0,2 2,3
0,3 3,3
4*4
7->2
2,0 0,1
3,0 0,0
1,0 0,2
8->4
2,1 1,1
odd num: center not move;
*/
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] mtx = new int[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
mtx[i][j] = sc.nextInt();
}
}
int movedCircles = n/2, tempVal0, tempVal1, tempVal2;
for(int i=0;i<movedCircles;i++){
for(int j=n-1-i;j>i;j--){
//4->2 1,0 0,1
tempVal0 = mtx[i][n-1-j];
mtx[i][n-1-j] = mtx[j][i];
//2->6 0,1 1,2
tempVal1 = mtx[n-1-j][n-1-i];
mtx[n-1-j][n-1-i] = tempVal0;
//6->8 1,2 2,1
tempVal2 = mtx[n-1-i][j];
mtx[n-1-i][j] = tempVal1;
//9->7
mtx[j][i] = tempVal2;
}
}
/*
0,2 2,2
3
1 2 3
4 5 6
7 8 9
4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
*/
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j==0){
System.out.printf("%d", mtx[i][j]);
}else{
System.out.printf(" %d", mtx[i][j]);
}
}
System.out.println();
}
}
} 总的来说,华为机考的难度是比较适中的,勤勤恳恳刷leetcode和浙大pat的童靴是一定可以通过的,加油ヾ(◍°∇°◍)ノ゙