[面试记录] 阿里盒马实习一面

阿里盒马实习一面

遇到了本校学长,然后给了三道算法题来做,算是三道吧。

第一道快速排序,算是基本功;第二道自己想复杂了,不需要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);
    }
}
posted @ 2021-02-02 18:07  herrhu  阅读(173)  评论(0)    收藏  举报