替换一个数字后的最大差值

180 阅读3分钟

🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 ->替换一个数字后的最大差值

问题描述

给你一个整数 num 。你知道 Danny Mittal 会偷偷将 0 到 9 中的一个数字 替换 成另一个数字。

请你返回将 num 中 恰好一个 数字进行替换后,得到的最大值和最小值的差为多少。

注意:

  • 当 Danny 将一个数字 d1 替换成另一个数字 d2 时,Danny 需要将 nums 中所有 d1 都替换成 d2 。
  • Danny 可以将一个数字替换成它自己,也就是说 num 可以不变。
  • Danny 可以将数字分别替换成两个不同的数字分别得到最大值和最小值。
  • 替换后得到的数字可以包含前导 0 。

示例 1:

输入: num = 11891
输出: 99009
解释:
为了得到最大值,我们将数字 1 替换成数字 9 ,得到 99899 。
为了得到最小值,我们将数字 1 替换成数字 0 ,得到 890 。
两个数字的差值为 99009 。

示例 2:

输入: num = 90
输出: 99
解释:
可以得到的最大值是 99(将 0 替换成 9),最小值是 0(将 9 替换成 0)。
所以我们得到 99 。

提示:

  • 1 <= num <= 10^8

思路分析

首先我们应该要先理解一下题目意思,题目会给我们一个整数,我们可以选择替换其中一种数字得到最大值,替换其中一种数字得到最小值,并计算其最大值与最小值之差。首先我们应该要先思考一下怎么得到最小值和最大值:

  • 怎么得到最大值?

我们知道,一个数字高位越大其值也会越大,所以我们应该要优先修改最高位的数字,我们能替换的数字只有0-9,所以我们应该找到数字中第一位不为9的数字,将全部该数字替换为9。这里需要注意,有可能数字的全部位数数字都为9,这个时候我们无法通过替换数字来获取更大的数字,所以我们不需要替换任何数字。

const m = num.split("").find((n) => n != "9") || "0";
const maxNum = num.replace(new RegExp(m, "g"), "9");
  • 怎么得到最小值?

与得到最大值相反,我们应该找到数字中第一位不为0的数字,将全部该数字替换为0。因为给的数字不会包含前缀0,所以我们可以直接默认将与最高位数字相同的全部数字替换为0

const minNum = num.replace(new RegExp(num[0], "g"), "0");
  • 替换数字中的字符

我们可以使用replace来替换数字中的字符,但直接使用replace替换字符的话只能替换第一个出现的字符,如下:

'9999'.replace('9','0')//'0999'

使用replace的话我们需要配合正则表达式来进行替换,如下:

'9999'.replace(/9/g,'0')//'0000'

这里我们使用变量的话可以使用RegExp来获取一个正则实例对象,如下:

const n = '9';
'9999'.replace(new RegExp(n, "g"),'0')//'0000'

当然,我们还可以直接使用replaceAll方法来替换数字中的字符,如下:

'9999'.replaceAll('9','0')//'0000'

AC 代码

完整 AC 代码如下:

/**
 * @param {number} num
 * @return {number}
 */
var minMaxDifference = function (num) {
  num += "";
  const m = num.split("").find((n) => n != "9") || "0";
  const maxNum = num.replace(new RegExp(m, "g"), "9");
  const minNum = num.replace(new RegExp(num[0], "g"), "0");
  return parseInt(maxNum) - parseInt(minNum);
};

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,在此谢谢大家的支持,我们下文再见 🙌。