[面试记录] 阿里盒马实习一面
阿里盒马实习一面
遇到了本校学长,然后给了三道算法题来做,算是三道吧。
第一道快速排序,算是基本功;第二道自己想复杂了,不需要dfs暴搜,直接用随机数好了;第三道感觉像是个数学问题
//评测题目: 无
//输入int 数组,使用快速排序算法进行排序。
public void QuickSort(int[] arr, int l, int r) {
if(l >= r) return;
int i = l;
int j = r;
int x = arr[(l + r) >> 1];
while(i < j ) {
while(x > arr[i]) {
i ++;
}
while(x < arr[j]) {
j --;
}
if(i < j) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
QuickSort(arr, l, j);
QuickSort(arr, j + 1, r);
}
// 红包算法,给定一个红包总金额和分红包的人数,输出每个人随机抢到的红包金额。
// 要求:
// 1. 每个人都要抢到红包,并且金额随机
// 2. 每个人抢到的金额数不小于1
// 3. 每个人抢到的金额数不超过总金额的30%
// 例如总金额100,人数10,输出【19 20 15 1 25 14 2 2 1 1】
List<Integer> res = new LinkedList<>();
public List<Integer> RedBag(int sum, int num) {
dfs(sum, 0, num);
return res;
}
public void dfs(int sum, int x, int num, int initSum) {
if(res.size() == num) {
return;
}
if(sum == 0) {
return;
}
if(x == 9) {
if(sum < initSum) {
res.add(sum);
return;
}
}
for(int i = 1; i < initSum * 0.3; i ++){
res.add(i);
dfs(sum - i, x + 1, num, initSum);
res.remove(i);
}
}
// 现有100瓶啤酒,每3个空瓶子换一瓶啤酒,每7个瓶盖子也可以换一瓶啤酒,问最后可以喝多少瓶啤酒?
public int getSum(int sum) {
return 100 + getNum(100,100);
}
public int getNum(int i, int j) {
if(i < 3 && j < 7) {
return 0;
} else {
int x = i / 3 + i % 3 + j / 7;
int y = j / 7 + j % 7 + i /3;
return i / 3 + j / 7 + getNum(x, y);
}
}

浙公网安备 33010602011771号