首页 > 华为社招机考2月23号晚
头像
jackSmith
编辑于 2021-02-23 23:52
+ 关注

华为社招机考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度得到一个新矩阵,然后打印出来。看到这里,我心想也太简单了,直接线性代数变换就好了。但是,题目最后来了一句,不允许新建一个变换矩阵做叉乘,瞬间把这题从简单题拉到困难。
例如:
输入:
3
1 2 3
4 5 6
7 8 9
输出:
7 4 1
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的童靴是一定可以通过的,加油ヾ(◍°∇°◍)ノ゙

更多模拟面试

全部评论

(8) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐