前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
一个XX产品行销总公司,只有一个boss,其有若干一级分销,一级分销又有若干二级分销,每个分销只有唯一的上级分销。
规定,每个月,下级分销需要将自己的总收入 (自己的+下级上交的) 每满100元上交15元给自己的上级。
现给出一组分销的关系,和每个分销的收入,请找出boss并计算出这个boss的收入。比如:
- 收入100元上交15元;
- 收入199元(99元不够100)上交15元;
- 收入200元,上交30元。
输入
分销关系和收入: [[分销id 上级分销的ld 收入,[分销id 上级分销的id 收入],[分销id 级分销的id 收入]]。
- 分销ID范围 0…65535
- 收入范围: 0…65535,单位元
提示: 输入的数据只存在1个boss,不存在环路
输出
[boss的ID,总收入]
解题思路
1、先找出boss的ID
2、使用递归逐级向下获取提成
题解
Java实现
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
/**
* @author arnold
* @date 2024年12月09日
*
*/
public class T02 {
public static boolean hasChildren(int[][] data, int n, int id) {
for (int i = 0; i < n; i++) {
if(data[i][1] == id) {
return true;
}
}
return false;
}
public static int getFromChildren(int[][] data, int n, int id, int bossId){
// 下级的分销提成
int m = 0;
//获取自己的收入
int selfIncome = 0;
for (int i = 0; i <n; i++) {
if(data[i][0] == id ) {
selfIncome = data[i][2];
break;
}
}
// 递归获取分销提成收入
if(hasChildren(data, n, id)) {
for (int i = 0; i <n; i++) {
if(data[i][1] == id ) {
int ext = getFromChildren(data, n, data[i][0],bossId);
m += ext;
}
}
}
// 计算要上交的提成
if (id !=bossId) {
m = (selfIncome + m)/100 * 15;
}
return m;
}
// 1 找出boss
// 2 根据分销数据计算boss 收入
public static void main(String[] args) {
Set<Integer> ids = new HashSet<>();
int bossId = 0;
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] data = new int[n][3];
for (int i = 0; i< n; i++) {
for (int j = 0; j< 3; j++) {
data[i][j] = sc.nextInt();
}
//找出boss 上级在员工ID列表里面没有的就是boss
ids.add(data[i][0]);
if (! ids.contains(data[i][1])) {
bossId = data[i][1];
}
}
int ext = getFromChildren(data, n ,bossId, bossId);
System.out.println(bossId + ": " + ext);
}
}