具有最高薪水问题的贪心算法?

Posted

技术标签:

【中文标题】具有最高薪水问题的贪心算法?【英文标题】:Greedy Algorithm with Maximum Salary Problem? 【发布时间】:2021-11-23 17:38:18 【问题描述】:

我正在尝试解决以下问题。我认为我的解决方案运行良好。但是,我尝试上传解决方案的系统不接受我的解决方案。可能有些测试失败了。我可以知道我错过了什么吗?

问题是:

作为成功面试的最后一个问题,你的老板会给你几张纸,上面有数字,并要求你从这些数字中组成一个最大的数字。得到的数字将是你的薪水,所以你对最大化这个数字非常感兴趣。你怎么能这样做?

示例 1

输入

2

21 2

输出:221

示例 2

输入

3

23 39 92

输出:923923

我的解决方案是:

function MaxSallary(nums) 
  let maxSize = Math.max(...nums).toString().length;
  let newArr = [];

  nums.map((num) => 
    while (num.toString().length < maxSize) 
      num = num.toString().concat(num.toString().split("").slice(-1)[0]);
    

    newArr.push(Number(num));
  );

  finalArr = [];
  while (newArr.length > 0) 
    let minIndex = newArr.indexOf(Math.max(...newArr));
    newArr.splice(minIndex, 1);
    finalArr.push(...nums.splice(minIndex, 1));
  
  return finalArr.join("");


console.log(MaxSallary([2, 12, 34, 11, 43, 21, 5]));

【问题讨论】:

我猜这样的自动化测试工具需要MaxSallary 将计算出的工资作为数字返回而不是打印出来?至于实际的算法本身,我觉得 sort+join 应该以某种方式完成。 我编辑了代码,但情况和以前一样。请给我你的解决方案好吗? 重复python - Constructing the largest number possible by rearranging a list - Stack Overflow ...编程语言除外 【参考方案1】:

您想知道应该以什么顺序连接数字,以便一旦解析回数字,结果是可能的最高值。改写成这样,看来我们应该先对数组进行排序。

当比较两个数字ab时,要知道哪个应该先出现,我们需要知道$a$b$b$a之间的which one is higher:

.sort((a, b) => parseInt(`$b$a`, 10) - parseInt(`$a$b`, 10)))

.sort mutates the array(并返回它),所以我首先是cloning it。

function MaxSallary(nums) 
  const salary = [...nums]
    .sort((a, b) => parseInt(`$b$a`, 10) - parseInt(`$a$b`, 10))
    .join("");
  return salary;


console.log(MaxSallary([21, 2]));
console.log(MaxSallary([23, 39, 92]));
console.log(MaxSallary([2, 12, 34, 11, 43, 21, 5]));

【讨论】:

输出为:Your output: 9.999999998888888e+108 Correct output: 9999999998888888888887777777776666666666555555554444444443333333333222222222111111111111111101010101010101010 @CihatŞaman 他们似乎想要一个字符串作为输出,而不是一个数字。尝试直接删除最后的parseIntreturn salary; 如果我使用以下数组作为您和我的解决方案的输入,输出会略有不同。 let testVal = [37, 21, 4, 86, 42, 54, 81, 53, 76, 37, 16, 63, 6, 15, 58, 93, 73, 43, 85, 2,39, 14, 63, 62, 29, 12, 56, 95, 24, 98, 95, 77, 55, 95, 28, 96, 81, 20, 47, 21, 2, 92, 87, 52, 52, 67, 73, 93, 68, 9, 2, 94, 65, 57, 89, 64, 50, 83, 16, 99, 52, 64, 100, 28, 94, 71, 58, 13, 64, 6, 56, 79, 42, 90, 75, 97, 29, 59, 32, 1, 10, 45, 50]; 如果您检查两个解决方案的数组,您会看到最后 2 位数字不同?真的,我想知道为什么输出不一样。 或者只是const maxSalary = (xs) =&gt; xs .map (String) .sort () .reverse () .join ('')

以上是关于具有最高薪水问题的贪心算法?的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法的简单理解

贪心算法回溯算法

贪心算法的理解

五大常用算法之一:贪心算法

2017.12.27 算法分析 贪心算法删除数字求最小值问题

算法导论----贪心算法,删除k个数,使剩下的数字最小