华为OD机试之Boss分销提成计算(boss的收入)(Java源码)

这篇具有很好参考价值的文章主要介绍了华为OD机试之Boss分销提成计算(boss的收入)(Java源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Boss分销提成计算(boss的收入)

题目描述
一个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行输入关系的总数量N
第2行开始,输入关系信息,格式: 分销ID 上级分销ID 收入
比如:
5
1 0 100
2 0 199
3 0 200
4 0 200
5 0 200


输出描述

输出: boss的ID 总收入
比如:
0 120


备注:
给定的输入数据都是合法的,不存在环路,重复的

用例

输入 输出 说明
5
1 0 100
2 0 199
3 0 200
4 0 200
5 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;
					}
				}
			}
			if (mapList.containsKey(id)) {
				for (Map<Integer, Integer> m2 : mapList.get(id)) {
					self += calc(m2.keySet().iterator().next(), id);
				}
			}
			// System.out.println(id+"->"+(self/100)*15);
			return (self / 100) * 15;
		} else {
			for (Map<Integer, Integer> m3 : mapList.get(bossId)) {
				int id1 = m3.keySet().iterator().next();
				// System.out.println("第一层:"+id1);
				bossSum += calc(id1, bossId);
			}
		}
		return 0;
	}
}

代码运行示例
华为OD机试之Boss分销提成计算(boss的收入)(Java源码)

华为OD机试之Boss分销提成计算(boss的收入)(Java源码)文章来源地址https://www.toymoban.com/news/detail-487879.html

到了这里,关于华为OD机试之Boss分销提成计算(boss的收入)(Java源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 华为OD机试之全量和已占用字符集(Java源码)

    题目描述 给定两个字符集合,一个是全量字符集,一个是已占用字符集,已占用字符集中的字符不能再使用。 输入描述 输入一个字符串 一定包含@,@前为全量字符集 @后的为已占用字符集 已占用字符集中的字符一定是全量字符集中的字符 字符集中的字符跟字符之间使用英文

    2024年02月07日
    浏览(54)
  • 华为OD机试之阿里巴巴找黄金宝箱(II)(Java源码)

    题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~n 的箱子,每个箱子上面贴有箱子中藏有金币的数量。 从金币数量中选出一个数字集合,并销毁贴有这些数字的每个箱子,如果能销毁一半及以上的箱子,则返回这个数字

    2024年02月09日
    浏览(57)
  • 华为OD机试之最小调整顺序次数、特异性双端队列(Java源码)

    题目描述 有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。 小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据(可能从头部添加、也可能从尾部添加),依次添加1到n;n个指令是移出数据。 现在要求移除数据

    2024年02月07日
    浏览(47)
  • python招聘数据爬取分析可视化系统(BOSS直聘)+Django框架(源码+文档+全套讲解视频)计算机毕业设计✅

    毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏) 毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总 🍅 感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。

    2024年02月19日
    浏览(59)
  • BOSS直聘招聘经验

    招聘低端兼职岗位。流量很大,来的人通常实力也不足。 招聘高端兼职岗位。流量不多。来的人通常具备一定实力。 招聘高薪职位,流量一般,会有有实力的勾搭。 招聘低薪职位,流量一般。通常没什么实力。

    2024年02月21日
    浏览(49)
  • 2023华为OD机试真题【计算数组中心位置】【Java Python】

    给你一个整数数组nums,请计算数组的中心位置。数组的中心位置是数组的一个下标, 其左侧所有元素相乘的积等于右侧所有元素相乘的积。数组第一个元素的左侧积为1,最后一个元素的右侧积为1。 如果数组有多个中心位置,应该返回最靠近左边的那一个,如果数组不存在

    2024年02月14日
    浏览(55)
  • 【华为OD机试】计算最接近的数【2023 B卷|100分】

      【 华为OD机试】-真题 !!点这里!! 【 华为OD机试】真题考点分类 !!点这里  !! 题目描述 给定一个数组X和正整数K,请找出使表达式: X[i] - X[i + 1] -  ... - X[i + K - 1] 结果最接近于数组中位数的下标 i ,如果有多个 i 满足条件,请返回最大的 i. 其中,数组中位数: 长度为

    2024年02月12日
    浏览(34)
  • 华为OD机试 - 计算最接近的数(Java & JS & Python)

    题目描述 给定一个数组X和正整数K,请找出使表达式: X[i] - X[i + 1] -  ... - X[i + K - 1] 结果最接近于数组中位数的下标 i ,如果有多个 i 满足条件,请返回最大的 i. 其中,数组中位数:长度为N的数组,按照元素的值大小升序排列后,下标为 N/2 元素的值 输入描述 无 输出描述

    2024年02月13日
    浏览(44)
  • 爬取boss直聘简单案例

    以chrome自动化为例 下载浏览器驱动 最新版本:Chrome for Testing availability (googlechromelabs.github.io) 旧版本:ChromeDriver - WebDriver for Chrome - Downloads (chromium.org) 查看chrome的版本 设置-关于chrome 如图116版本, 大版本号要和驱动对应 。 下载如图116稳定版 安装驱动 将下载好的 chromedriver

    2024年02月11日
    浏览(43)
  • 华为OD机试 - 二叉树计算(Java & JS & Python & C)

    目录 题目描述 输入描述 输出描述 用例 题目解析 JS算法源码

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包