1432. 改变一个整数能得到的最大差值

题目 #

1432. 改变一个整数能得到的最大差值

给你一个整数 num 。你可以对它进行以下步骤共计 两次

  • 选择一个数字 x (0 <= x <= 9).
  • 选择另一个数字 y (0 <= y <= 9) 。数字 y 可以等于 x
  • num 中所有出现 x 的数位都用 y 替换。

令两次对 num 的操作得到的结果分别为 ab

请你返回 ab最大差值

注意,新的整数(ab必须不能 含有前导 0,并且 0。

示例 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

解答 #

分类讨论:

  • 最大值:找到第一个不为9的数,将全部这个数替换为9即可
  • 最小值:
    1. 第一个数为1:找第一个大于1的数(而不是第一个大于0的数,因为等于1,不能将其修改为0,会产生前导零),将其修改为0
    2. 第一个数不为1:修改第一个数,将其修改为1,其他等于第一个数的也修改为1
class Solution {
    int getMax(char[] arr){
        int i=0;
        while(i<arr.length&&arr[i]=='9'){i++;};
        if(i!=arr.length){
            char target=arr[i];
            arr[i]='9';
            for(int index=i+1;index<arr.length;index++){
                if(target==arr[index]){
                    arr[index]='9';
                }
            }
        }
        return Integer.parseInt(new String(arr));
    }

    int getMin(char[] arr){
        if(arr[0]=='1'){
            int i=1;
            while(i<arr.length&&arr[i]<='1'){i++;};
            if(i!=arr.length){
                char target=arr[i];
                arr[i]='0';
                for(int index=i+1;index<arr.length;index++){
                    if(target==arr[index]){
                        arr[index]='0';
                    }
                }
            }
        }else{
            char target=arr[0];
            arr[0]='1';
            for(int index=1;index<arr.length;index++){
                if(target==arr[index]){
                    arr[index]='1';
                }
            }
        }
        return Integer.parseInt(new String(arr));
    }

    public int maxDiff(int num) {
        if (num < 10)
            return 8;
        String numStr = String.valueOf(num);
        char[] arr = numStr.toCharArray();
        int maxVal = getMax(arr);
        arr=numStr.toCharArray();// 注意需要重开一个数组,不然一直修改同一个数组
        int minVal = getMin(arr);
        // System.out.println(maxVal+":"+minVal);
        return maxVal - minVal;
    }
}