华为OD机试之Boss分销提成计算(boss的收入)(Java源码)_一个xx产品行销总公司,只有一个boss,其有若干一级分销,一级分销又有若干二级分销,

最后

金三银四马上就到了,希望大家能好好学习一下这些技术点

学习视频:

大厂面试真题:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

| 51 0 1002 0 1993 0 2004 0 2005 0 200 | 0 120 | 其中bossid为0 并且其只有一层分销节点,那么其提成为 1->15 2->15 3->30 4->30 5->30 和为120 |

解析

  1. 这个题重在理解题意和数据结构的确定,如果是在js中,可以使用json列表去实现,其数据结构可以定位为
/\*\*
 \* {"boss":{
 \* id:0,
 \* income:100,
 \* child:[
 \* { id:1, "income":100,child:[]},
 \* { id:2, "income":100,child:[]},
 \* { id:3, "income":100,child:[]},
 \* ]
 \* }
 \* }
 \*
 \*/

  1. 而在java中,也可以借助类去创建带关联关系的实体类
public class Point{
	int id;//编号
	int self;//本金
	List<Point> child;//自己的所有的子节点
}

  1. 本文采用的是Map结构来进行实现
{
"上级分销ID":[
	{"下级分销id":"收入"},
	{"下级分销id":"收入"}],
"上级分销ID1":[
	{"下级分销id":"收入"},
	{"下级分销id":"收入"}],
}

这里是把所有的有子节点的作为Map最外层的键,值该分销商ID对应的子分销商列表,列表中以键值对的形式存储了每个分销商的id和收入。
例如输入:
5
1 0 199
2 0 200
3 1 300
4 2 400
5 2 300
转换为对应的Map对象为:

{0=[{1=199}, {2=200}],
 1=[{3=300}], 
 2=[{4=400}, {5=300}]
 }

Q:那么如何找出boss节点?
A:双层for循环查找,所有的子节点中不包含该分销商id的话,其为boss节点

Q:如何计算某节点的提成?
A: 整体以迭代的方式进行计算,方法参数为当前id和当前id的父id。父id是为了直接在最外层map中作为键取到一个列表,从而快速定位到该id 以及取到其对应的本金
(1) 叶子节点,判断其没有子节点,则直接使用本金进行计算,并返回提成
(2) 非叶子节点,其提成为本金加上所有子节点的提成(因此需要使用迭代进行计算)

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public abstract class T61 {
	static Map<Integer, List<Map<Integer, Integer>>> mapList = new HashMap<Integer, List<Map<Integer, Integer>>>();
	// {"上级分销":[{"下级分销id":"收入"},{"下级分销id":"收入"}]}
	static List<Integer> parentIdList = new ArrayList<>();// 记录所有的父经销商 后面方便使用
	// {"boss":{income:100,child:[{"income":100,child:[]}]}}
	static int bossId;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = Integer.parseInt(sc.nextLine());
		for (int i = 0; i < num; i++) {
			// id 上级id 收入
			String[] str = sc.nextLine().split(" ");
			int nowId = Integer.parseInt(str[0]);
			int parentId = Integer.parseInt(str[1]);
			int income = Integer.parseInt(str[2]);
			Map<Integer, Integer> map = new HashMap<>();
			map.put(nowId, income);
			if (mapList.containsKey(parentId)) {
				mapList.get(parentId).add(map);
			} else {
				List<Map<Integer, Integer>> maps = new ArrayList<>();
				maps.add(map);
				mapList.put(parentId, maps);
				parentIdList.add(parentId);
			}
		}
		bossId = findBossId();
		System.out.println(mapList);
// System.out.println(findBossId());
		calc(bossId, bossId);
		System.out.println(bossId+" "+bossSum);
	}

	// 找出boss
	public static Integer findBossId() {
		Integer bossId = null;
		// 遍历map的 可以 如果key不是其他经销商的子节点 那么就为boss
		for (Integer pId : parentIdList) {
			boolean flag = false;// 该父id是否在 其他的子节点中
			for (Integer pID1 : parentIdList) {
				if (pId != pID1) {
					if (mapList.get(pID1).contains(pId)) {
						flag = true;
						break;
					}
				}
			}
			if (flag == false) {
				bossId = pId;
				break;
			}
		}
		return bossId;
	}

	// 找出某个子节点的子经销商的提成
	static Integer bossSum = 0;

	public static Integer calc(int id, int parentId) {
		// System.out.println("正在查找id->"+id);
		if (id != bossId) {
			// 获取本金
			int self = 0;
			if (mapList.containsKey(parentId)) {
				for (Map<Integer, Integer> m : mapList.get(parentId)) {
					if (m.keySet().iterator().next() == id) {
						self = m.get(id);
						// System.out.println("本金->"+m.get(id));
						break;


### 最后

做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。
当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。

**更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务**

![](https://img-blog.csdnimg.cn/img_convert/3b0a862871bc3515a6b84815aa44e7fb.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/7994acb0836bfcc275679d383472a213.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/98af9c09f9a0436bbdea0904395e9837.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/baa897f41418c9f9b776520a4fe01574.webp?x-oss-process=image/format,png)

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值