• 华为OD机考算法题:分奖金


    题目部分

    题目分奖金
    难度
    题目说明公司老板做了一笔大生意,想要给每位员工分配一些奖金,想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序,每个人随机抽取一个数字。按照工号的顺序往后排列,遇到第一个数字比自己数字大的,那么,前面的员工就可以获得 距离 * 数字差值 的奖金。如果遇不到比自己数字大的,就给自己分配随机数数量的奖金。例如,按照工号顺序的随机数字是:2,10,3。那么第 2 个员工的数字 10 比第 1 个员工的数字 2 大,所以,第 1 个员工可以获得 1 * (10 - 2) = 8。第 2 个员工后面没有比他数字更大的员工,所以,他获得他分配的随机数数量的奖金,就是 10。第 3 个员工是最后一个员工,后面也没有比他更大数字的员工,所以他得到的奖金是 3。
    请帮老板计算一下每位员工最终分到的奖金都是多少钱。
    输入描述第一行 n 表示员工数量(包含最后一个老板)。
    第二是每位员工分配的随机数字。
    例如:
    3
    2 10 3
    输出描述最终每位员工分到的奖金数量。
    例如:
    8 10 3
    补充说明随机数字不重复,员工数量(包含老板)范围 1 ~ 10000,随机数范围 1 ~ 100000。
    ------------------------------------------------------
    示例
    示例1
    输入3
    2 10 3
    输出8 10 3
    说明


    解读与分析

    题目解读

    分奖金时,员工先按照员工号排序。每位员工的奖金数与工号更大的员工抽取的数字相关,与工号小的员工没有关系。

    此题可翻译成:有一个整形数组,设为 arr,其长度为 n,数组个元素已经初始化为指定的值。对于数组中第 i (0 ≤ i < n)个元素,如果:
    1. 在第 ( i + 1 ) 到 n 个元素中存在比 arr[i] 大的元素,如果这样的元素有多个,取其下标最小的一个元素。假设下标最小的元素其下标为 j,那么 arr[i] 的值修改为 ( arr[j] - arr[i] ) * ( j - i)。
    2. 
    在第 ( i + 1 ) 到 n 个元素中存在比 arr[i] 大的元素,那么 arr[i] 的值保持不变。
    遍历完数组 arr 之后,输出数组 arr 的内容。

    分析与思路

    虽然此题的难度为“难”,解题思路和算法却都非常简单。

    我们可以直接从第 0 个元素开始往后遍历,根据题目解读中提到的两种情况,逐一刷新每个元素的值。因为每个元素的最终值只与排在它后面的元素有关,所以一定要从第 0 个元素开始遍历,而不能从最后一个元素 (n - 1) 开始遍历。

    在遍历过程中,最坏的情况需遍历 n! 次元素,此算法的时间复杂度 O(n!);整个遍历过程只使用了原始数据类型变量,且空间与数组长度无关,此算法的空间复杂度为 O(1)。


    代码实现

    Java代码

    1. import java.util.Scanner;
    2. /**
    3. * 分奖金
    4. * @since 2023.09.11
    5. * @version 0.1
    6. * @author Frank
    7. *
    8. */
    9. public class BonusDistribution {
    10. public static void main(String[] args) {
    11. Scanner sc = new Scanner(System.in);
    12. while (sc.hasNext()) {
    13. String input = sc.nextLine();
    14. int count = Integer.parseInt( input );
    15. input = sc.nextLine();
    16. String[] numbers = input.split( " " );
    17. // 此处 count == numbers.count,可以完全不用考虑 count.
    18. processBonusDistribution( numbers );
    19. }
    20. }
    21. private static void processBonusDistribution( String numbers[] )
    22. {
    23. int[] arr = arrString2Int( numbers );
    24. for( int i = 0; i < arr.length; i ++ )
    25. {
    26. for( int j = i + 1; j < arr.length; j ++ )
    27. {
    28. if( arr[j] > arr[i] )
    29. {
    30. arr[i] = ( arr[j] - arr[i] ) * ( j - i );
    31. break;
    32. }
    33. }
    34. }
    35. StringBuffer sb = new StringBuffer();
    36. for( int i = 0; i < arr.length; i ++ )
    37. {
    38. if( i != arr.length - 1 )
    39. {
    40. sb.append( arr[i] + " " );
    41. }else
    42. {
    43. sb.append( arr[i] );
    44. }
    45. }
    46. System.out.println( sb.toString() );
    47. }
    48. private static int[] arrString2Int( String numbers[] )
    49. {
    50. int ret[] = new int[numbers.length];
    51. for( int i = 0; i < numbers.length; i ++ )
    52. {
    53. ret[i] = Integer.parseInt( numbers[i] );
    54. }
    55. return ret;
    56. }
    57. }

    JavaScript代码

    1. const rl = require("readline").createInterface({ input: process.stdin });
    2. var iter = rl[Symbol.asyncIterator]();
    3. const readline = async () => (await iter.next()).value;
    4. void async function() {
    5. while (line = await readline()) {
    6. // count 可以忽略
    7. var count = parseInt(line);
    8. line = await readline();
    9. var numberArr = line.split(" ");
    10. processBonusDistribution(numberArr);
    11. }
    12. }();
    13. function processBonusDistribution(numberArr) {
    14. var arr = arrString2Int( numberArr );
    15. for( var i = 0; i < arr.length; i ++ )
    16. {
    17. for( var j = i + 1; j < arr.length; j ++ )
    18. {
    19. if( arr[j] > arr[i] )
    20. {
    21. arr[i] = ( arr[j] - arr[i] ) * ( j - i );
    22. break;
    23. }
    24. }
    25. }
    26. console.log( arr.join(" "));
    27. }
    28. function arrString2Int( numberArr )
    29. {
    30. var ret = [];
    31. for( var i = 0; i < numberArr.length; i ++)
    32. {
    33. ret.push( parseInt( numberArr[i] ) );
    34. }
    35. return ret;
    36. }

    (完)

  • 相关阅读:
    STM32-C语言结构体地址
    Pytorch解决 多元回归 问题的算法
    招聘丨云扩等你一起奔赴超自动化未来
    Python 1-03 基础语法测试
    聊天尬死名场面,你遇到过吗?教你一键获取斗图表情包,晋升聊天达人
    (数据科学学习手札145)在Python中利用yarl轻松操作url
    2023 年最新Java 毕业设计选题题目参考,500道 Java 毕业设计题目,值得收藏
    使用React18+Ts创建项目
    Java多线程与线程池解析
    一文解决动态规划~详解
  • 原文地址:https://blog.csdn.net/ZiJinShi/article/details/132767869