看到的柱子个数

前言:

这是字节----飞书秋招的笔试题第一题,总共有四题(全是编程题,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 的时候

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bu Sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值