假设我们有一个整数num。我们将正确地执行以下步骤两次,步骤类似于-
在0到9的范围内选择一个数字x。
在0到9的范围内选择另一个数字y。数字y可以等于x。
将num的十进制表示形式中所有出现的x替换为y。新整数不能有任何前导零,新整数也不能具有值0。
现在,将a和b分别视为将运算分别应用于num和num的结果。然后找到a和b之间的最大差。
因此,如果输入类似于555,则输出将为888,这是首次选择x = 5和y = 9并将新的整数存储在a中。第二次选择x = 5和y = 1并将新的整数存储在b中。
因此我们现在有a = 999和b = 111,最大差为= 999-111 = 888。
为了解决这个问题,我们将遵循以下步骤-
定义一个函数getMax(),它将取x,
s:=将x转换为字符串
一个:='9'
i:= 0
而(i <s和s [i]的大小与'9'相同),则执行-
(将i增加1)
如果i <s的大小,则-
a:= s [i]
对于初始化i:= 0,当i <s的大小时,更新(将i增加1),执行-
s [i]:='9'
如果s [i]与a相同,则-
返回s作为数字
定义一个函数getMin(),它将取x,
s:=将x转换为字符串
如果s [0]不等于'1',则-
如果s [i]与a相同,则-
s [i]:='1'
a:= s [0]
对于初始化i:= 0,当i <s的大小时,更新(将i增加1),执行-
除此以外
如果s [i]与a相同,则-
s [i]:='0'
a:= s [i]
(将i增加1)
返回1
如果s的大小等于1,则-
i:= 0
一个:='1'
而(i <s的大小和s [i] <='1'),则执行-
如果i <s的大小,则-
对于初始化i:= 1,当i <s的大小时,更新(将i增加1),-
返回s作为数字
从主要方法中执行以下操作-
一个:= getMax(num)
b:= getMin(num)
返回| a-b |
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int getMax(int x){
string s = to_string(x);
char a = '9', b;
int i = 0;
while (i < s.size() && s[i] == '9')
i++;
if (i < s.size())
a = s[i];
for (int i = 0; i < s.size(); i++) {
if (s[i] == a) {
s[i] = '9';
}
}
return stoi(s);
}
int getMin(int x){
string s = to_string(x);
char a;
if (s[0] != '1') {
a = s[0];
for (int i = 0; i < s.size(); i++) {
if (s[i] == a) {
s[i] = '1';
}
}
}
else {
if (s.size() == 1) {
return 1;
}
int i = 0;
a = '1';
while (i < s.size() && s[i] <= '1')
i++;
if (i < s.size())
a = s[i];
for (int i = 1; i < s.size(); i++) {
if (s[i] == a) {
s[i] = '0';
}
}
}
return stoi(s);
}
int maxDiff(int num) {
int a = getMax(num);
int b = getMin(num);
return abs(a - b);
}
};
main(){
Solution ob;
cout << (ob.maxDiff(666));
}666
输出结果
888