昨天晚上做了阿里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));
}
}