【
给你一个整数 num 。你可以对它进行如下步骤恰好 两次 :
选择一个数字 x (0 <= x <= 9).
选择另一个数字 y (0 <= y <= 9) 。数字 y 可以等于 x 。
将 num 中所有出现 x 的数位都用 y 替换。
得到的新的整数 不能 有前导 0 ,得到的新整数也 不能 是 0 。
令两次对 num 的操作得到的结果分别为 a 和 b 。
请你返回 a 和 b 的 最大差值 。
示例 1:
输入:num = 555
输出:888
解释:第一次选择 x = 5 且 y = 9 ,并把得到的新数字保存在 a 中。
第二次选择 x = 5 且 y = 1 ,并把得到的新数字保存在 b 中。
现在,我们有 a = 999 和 b = 111 ,最大差值为 888
示例 2:
输入:num = 9
输出:8
解释:第一次选择 x = 9 且 y = 9 ,并把得到的新数字保存在 a 中。
第二次选择 x = 9 且 y = 1 ,并把得到的新数字保存在 b 中。
现在,我们有 a = 9 和 b = 1 ,最大差值为 8
示例 3:
输入:num = 123456
输出:820000
示例 4:
输入:num = 10000
输出:80000
示例 5:
输入:num = 9288
输出:8700
提示:
1 <= num <= 10^8
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/max-difference-you-can-get-from-changing-an-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
】
首先把数字按位存进数组。
然后一次把这个数变成最大,接着一次把这个数变成最小,很多条件判断,代码较长。
这道题主要在于细节。
int idx;
void tonumarr(int num, int *numarr) {
int tmp;
while(num) {
tmp = num % 10;
numarr[idx++] = tmp;
num = num / 10;
}
}
int getnum(int *newarr) {
int i;
int ret = 0;
for (i = idx - 1; i >= 0; i--) {
ret = ret * 10 + newarr[i];
}
return ret;
}
int getmin(int num, int *numarr) {
int ret = 0;
int i;
int *newarr = NULL;
int tmp = 0xff; // 初始化
int flag = 0xff;
if (idx == 1) { // 个位数直接置1
return 1;
}
newarr = (int *)malloc(sizeof(int) * 9);
memcpy(newarr, numarr, sizeof(int) * 9);
// 到这里肯定不是个位数了,判断首位是否是1
if (newarr[idx - 1] != 1) {
tmp = newarr[idx - 1]; // 即需要把所有的tmp换成1
newarr[idx - 1] = 1;
}
for (i = idx - 2; i >= 0; i--) { // 至少能跑进去一次
if (flag == 0xff && newarr[i] != 0 && newarr[i] != newarr[idx - 1]) {
if (tmp == 0xff) { // 首位是1的话,以第二位开始变
tmp = newarr[i];
flag = 0; // 第二位可以直接变为0
} else {
flag = 1; // 首位非1的话,只能变为1
}
}
if (newarr[i] == tmp) {
newarr[i] = flag;
}
}
ret = getnum(newarr);
return ret;
}
int getmax(int num, int *numarr) {
int ret = 0;
int i;
int *maxarr = NULL;
int tmp = 0xff; // 初始化
int flag = 0;
if (idx == 1) { // 个位数直接置9
return 9;
}
maxarr = (int *)malloc(sizeof(int) * 9);
memcpy(maxarr, numarr, sizeof(int) * 9);
// 到这里肯定不是个位数了,判断首位是否是1
if (maxarr[idx - 1] != 9) {
tmp = maxarr[idx - 1]; // 即需要把所有的tmp换成9
maxarr[idx - 1] = 9;
}
for (i = idx - 2; i >= 0; i--) { // 至少能跑进去一次
if (tmp == 0xff && maxarr[i] != maxarr[idx - 1]) { // 首位是9的话,以第二位开始变
tmp = maxarr[i];
}
if (maxarr[i] == tmp) {
maxarr[i] = 9;
}
}
ret = getnum(maxarr);
return ret;
}
int maxDiff(int num){
int min;
int max;
int *numarr = (int *)malloc(sizeof(int) * 9);
memset(numarr, 0, sizeof(int) * 9);
idx = 0;
tonumarr(num, numarr);
min = getmin(num, numarr);
max = getmax(num, numarr);
return max - min;
}
/* 错误点:
1. if (newarr[idx - 1] != 1) 这里首位判断时,没有给首位赋值
2. if (tmp == 0xff) tmp判断只应该进一次,而for循环每次都进
3. 如果第一位为1,第二位也为1,那么第二位也不能变,这个没有考虑
4. 求最小,如果第二位为0也不选择,这个也漏了
*/