华为OD E卷(100分)02-Boss 的收入

前言

        工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近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);
	}

	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

arnold66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值