假设我们有一个整数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