C++中改变整数可以获得的最大差值
假设我们有一个整数num。我们将精确地应用以下步骤两次,步骤如下:
选择一个范围在0到9之间的数字x。
选择另一个范围在0到9之间的数字y。数字y可以等于x。
将num十进制表示中所有出现的x替换为y。新的整数不能有任何前导零,也不能值为0。
现在考虑a和b分别为第一次和第二次对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转换为字符串
a := '9'
i := 0
当(i < s的长度 且 s[i] 等于 '9') 时,执行:
(i加1)
如果i < s的长度,则:
a := s[i]
对于初始化i := 0,当i < s的长度时,更新(i加1),执行:
如果s[i] 等于a,则:
s[i] := '9'
返回s作为数字
定义一个函数getMin(),它将接收x,
s := 将x转换为字符串
如果s[0]不等于'1',则:
a := s[0]
对于初始化i := 0,当i < s的长度时,更新(i加1),执行:
如果s[i] 等于a,则:
s[i] := '1'
否则
如果s的长度等于1,则:
返回1
i := 0
a := '1'
当(i < s的长度 且 s[i] <= '1') 时,执行:
(i加1)
如果i < s的长度,则:
a := s[i]
对于初始化i := 1,当i < s的长度时,更新(i加1),执行:
如果s[i] 等于a,则:
s[i] := '0'
返回s作为数字
在主方法中执行以下操作:
a := 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