华为社招机考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的童靴是一定可以通过的,加油ヾ(◍°∇°◍)ノ゙

#华为##社招##Java工程师##面经#
全部评论
第2题建议看下这个博客,可以采用乘N取整法,所谓乘N取整法是将十进制的小数乘以N,得到的整数部分作为小数点后第一位。剩余的小数部分再乘以N,得到的整数部分作为小数点后第二位。直到剩余小数部分为0,或达到一定精度为止。https://www.cnblogs.com/yuanzessrs/p/11683690.html
1 回复
分享
发布于 2021-02-25 20:00
可以私信我,内推蚂蚁金服,支持查进度,简历指导。 https://www.nowcoder.com/discuss/599111 qq:943227789
点赞 回复
分享
发布于 2021-02-24 17:27
阿里巴巴
校招火热招聘中
官网直投
第二题能否把小数换成整数在进行转换呢,之后再转换为小数。这样会不会就不会出现精度造成的bug。只是说一下自己的大概想法😂,手头也没testcase
点赞 回复
分享
发布于 2021-02-25 03:05
请问一下是正式岗嘛
点赞 回复
分享
发布于 2021-02-28 01:19
这都是原题吧
点赞 回复
分享
发布于 2021-03-12 15:45
选择题大概是啥啊,楼主
点赞 回复
分享
发布于 2021-03-15 01:13
请问一下选择题是什么呀
点赞 回复
分享
发布于 2022-03-29 15:54
od?
点赞 回复
分享
发布于 2022-03-31 18:23

相关推荐

6 43 评论
分享
牛客网
牛客企业服务