阿里2018校招客户端研发笔试之编程题

昨天晚上做了阿里2018年校招的笔试题,笔试题分为选择和编程题,选择题主要是数学基础和代码分析,两个编程题都不是很难(可能是客户端开发的简单,小伙伴投的是java开发,听他说他的编程题很难^_^),全部AC,在此记录下。

NUM 1

题目描述:
进行可燃冰的开采时,开采人员会先绘制一幅地图(矩阵表示),你需要做的是找出地图中可燃冰的区域数,能连起来的算一个可燃冰区域。
第一个数输入的是n,后面输入的是一个n*n的矩阵,若啊a[i][j]有可燃冰则a[i][j]=”*”,否则a[i][j]=”0”。

输入示例:
8
这里写图片描述

输出结果:(区域数为红线圈出来的地方)
4

解题思路:
这其实是矩阵中寻找路径问题的变形。我们从头到尾一次遍历,每寻找到一个”*”,首先查看它是否被标记,没有的话,先标记此位置,然后以同样的方法遍历其周围八个方向的节点,假如此节点已经被标记,那么直接跳过这个位置,直接遍历下一个节点。另外需要注意的是一定要做好边界控制

public class Main {
    static int mCount = 0;
    static String[][] map;
    static boolean[][] bool;

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int count = scan.nextInt();
        mCount = count;
        map = new String[count][count];
        for (int i = 0; i < count; i++) {//矩阵的输入
            String str = scan.next();
            char[] chars = str.toCharArray();
            for (int j = 0; j < chars.length; j++) {
                map[i][j] = String.valueOf(chars[j]);
            }
        }

        int result = 0;
        bool = new boolean[count][count];//初始化标记矩阵
        for (int i = 0; i < count; i++) {
            for (int j = 0; j < count; j++) {
                if (bool[i][j] == false && map[i][j].equals("*")) {//若没有被标记,且此节点的值为星号,则对他周围八个方向的节点采取标记操作
                    result++;//区域数加1
                    asignBool(i, j);//执行标记操作
                }
            }
        }

        System.out.println(result);
        //内存回收
        map = null;
        bool = null;
        scan.close();
    }

    private static void asignBool(int row, int col) {
        if (map[row][col].equals("0") || (map[row][col].equals("*") && bool[row][col] == true)) {//递归退出条件
            return;
        }

        if (map[row][col].equals("*")) {//若是星号,则直接标记
            bool[row][col] = true;
        }

        if (row - 1 >= 0) {//节点上面的三个节点进行标记操作
            asignBool(row - 1, col);
            if (col + 1 < mCount) {
                asignBool(row - 1, col + 1);
            }
            if (col - 1 >= 0) {
                asignBool(row - 1, col - 1);
            }
        }

        if (col + 1 < mCount) {//此节点右边的节点的标记操作
            asignBool(row, col + 1);
        }
        if (col - 1 >= 0) {//此节点左边的节点的标记操作
            asignBool(row, col - 1);
        }

        if (row + 1 < mCount) {//此节点下面的三个节点的标记操作
            asignBool(row + 1, col);
            if (col + 1 < mCount) {
                asignBool(row + 1, col + 1);
            }
            if (col - 1 >= 0) {
                asignBool(row + 1, col - 1);
            }
        }
    }
}

NUM 2

题目描述:
给你30块钱,一瓶饮料3块钱,4个瓶盖换一瓶新的饮料,2个空瓶换一瓶新饮料,问这30块钱你一共能卖几瓶饮料?

解题思路:纯属是个数学题。先用30块钱买10瓶,然后算出瓶盖数量,空瓶数量,先用瓶盖换饮料,换完后更新饮料、瓶盖、空瓶的数量,然后用空瓶换饮料,同样换完后更新饮料、瓶盖、空瓶的数量,当瓶盖和空瓶的数量都不能再换时,饮料数量即为最终值。

public class Main {

    /** 请完成下面这个函数,实现题目要求的功能 **/
    /** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^ **/
    static int maxMount(int price, int cap, int emptyBottle, int money) {
        int result = 0;
        if (price <= 0 || cap <= 0 || emptyBottle <= 0 || money <= 0) {
            return result;
        }

        result = money / price;
        int capCount = result;
        int bottleCount = result;
        while (capCount >= cap || bottleCount >= emptyBottle) {//循环退出的条件是:瓶盖和空瓶的数量都不能再换新饮料。
            //先用瓶盖换。
            int getCapCount = capCount / cap;
            int remainCapCount = capCount % cap;
            capCount = getCapCount + remainCapCount;
            bottleCount += getCapCount;
            result += getCapCount;
            //再用空瓶换。
            int getBottleCount = bottleCount / emptyBottle;
            int remainBottleCount = bottleCount % emptyBottle;
            bottleCount = getBottleCount + remainBottleCount;
            capCount += getBottleCount;
            result += getBottleCount;
        }

        return result;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int res;

        int _price;
        _price = Integer.parseInt(in.nextLine().trim());

        int _cap;
        _cap = Integer.parseInt(in.nextLine().trim());

        int _emptyBottle;
        _emptyBottle = Integer.parseInt(in.nextLine().trim());

        int _money;
        _money = Integer.parseInt(in.nextLine().trim());

        res = maxMount(_price, _cap, _emptyBottle, _money);
        System.out.println(String.valueOf(res));

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值