投的是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
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) 回帖