前言:
这是字节----飞书秋招的笔试题第一题,总共有四题(全是编程题,120min),我用了大概60分钟左右把题看了两遍,然后交卷了,不是说题简单啊,企业要求不能使用本地的 idea,而且某网站的 idea 我是真的用不惯(吐槽一下)。本人属实很菜,离开本地 idea 啥也不是,写本文的原因仅仅是为了记录一下自己的秋招经历吧。
问题描述:(不是原文,全凭仅存的记忆)
输入一个整型的6*6的二维数组,共6行6列,表示有36根柱子,其中数字的大小表示的是柱子的高度,柱子高的能挡住低的,看到高的柱子之后,高柱子后边的柱子就看不到了。最后在数组最下方输入一行n,m两个数字,第一个数字n表示方向,第二个数字m表示第m行/列。
[说明:]
n 的取值是[0, 1, 2, 3],其中 0 代表从数组上边向下边看,1 代表从数组下边向上看,2 代表从数组右边向左看,3代表从数组左边向右看。如图:(不要说看不懂文字还看不懂图啊,人家给的题目可没有图)
m 的取值范围[1, 2, 3, 4, 5, 6], 表示的是1~6行/列中的某一行/列。
示例输入:(示例记不清楚了,自己写的)
1 2 3 4 5 6
2 3 4 5 6 1
3 4 5 6 1 2
4 5 6 1 2 3
5 6 1 2 3 4
6 1 2 3 4 5
2 3
示例输出:
4
示例说明:
2代表从数组的左边向右看,3表示看的是第三行。如图:
输出的结果 4 表示:从数组左边向右看第三行的数据,可以看到高度为3、4、5、6 四根柱子,故结果为 4,也就是下图中的绿色框框的四根柱子:
代码:
public static void main(String[] args) {
// 测试
int[][] arr = {{1,2,3,4,5,6},
{2,3,4,5,6,1},
{3,4,5,6,1,2},
{4,5,6,1,2,3},
{5,6,1,2,3,4},
{6,1,2,3,4,5}};
System.out.println("原数组的元素:");
for (int[] arr1 : arr) {
for (int a : arr1) {
System.out.print(a+"\t");
}
System.out.println();
}
System.out.println("------------------------");
int n1 = 0;
int m1 = 1;
System.out.println("(测试一)能看到的元素的个数:"+maxSum(arr,n1,m1));
int n2 = 2;
int m2 = 3;
System.out.println("(测试二)能看到的元素的个数:"+maxSum(arr,n2,m2));
}
// 计算能看到的最大的柱子个数
private static int maxSum(int[][] arr, int n, int m){
int tmp = 0; // 存储与需要比较的数组中的前一个位置的值
int res = 1; // 存储结果看到的最多的柱子个数
switch (n){
case 0: // 向下看,列不变,变的是行的值
tmp = arr[0][m-1];
for (int i=1; i<6; i++){
if(tmp < arr[i][m-1]){
res++; // 看到的个数+1
tmp = arr[i][m-1]; // 维护一下tmp的值
}else{
break;
}
}
break;
case 1: // 向上看,列不变,变的是行的值
tmp = arr[5][m-1];
for (int i=4; i>=0; i--){
if(tmp < arr[i][m-1]){
res++;
tmp = arr[i][m-1];
}else{
break;
}
}
break;
case 2: // 向左看,行不变,变的是列的值
tmp = arr[m-1][0];
for (int j=1; j<6; j++){
if(tmp < arr[m-1][j]){
res++;
tmp = arr[m-1][j];
}else{
break;
}
}
break;
case 3: // 向右看,行不变,变的是列的值
tmp = arr[m-1][5];
for (int j=4; j>=0; j--){
if(tmp < arr[m-1][j]){
res++;
tmp = arr[m-1][j];
}else{
break;
}
}
break;
default:
break;
}
return res;
}
结果:
测试的是 n = 0, m = 1 和 n = 2, m = 3 的时候