LeetCode最大交換(670の質問)2つの方法の図

LeetCode Max Exchange

@author:Jingdai
@date:2020.12.25

トピックの説明(670の質問)

負でない整数を指定すると、数値の任意の2桁を最大で1回交換できます取得できる最大値を返します。

例1:

输入: 2736
输出: 7236
解释: 交换数字2和数字7。

アイデアとコード

方法1並べ替え

まず、よく理解されている方法を見てみましょう。最初のステップは、元の数値を降順で並べ替えることです。つまり、交換の数が指定されていない場合に到達できる最大値です。示されているように2736、ソートのタイトルなどは後だったsortedNums = 7632次に、ソートされた番号を前の番号と比較し、異なる最初の番号(この番号の2と7など)を見つけます。2と7を入れ替えるだけです。2の添え字はわかっていて、7の添え字はわからないので、トラバースして7の添え字を見つけて、それを交換するだけです。

ここに画像の説明を挿入します

ただし、たとえば、にnumsなるなどの反復要素がある場合は、273672と7を交換するか、交換する必要がありますが、結果が大きくなるため、後者を選択する必要がある2 77があります。 、したがって、後ろから7の添え字を探す必要があります。

ここに画像の説明を挿入します

最終的なコードは次のとおりです。

public int maximumSwap(int num) {
    
    
    char[] nums = String.valueOf(num).toCharArray();
    // sort
    char[] sortedNums = nums.clone();
    Arrays.sort(sortedNums);
    int left = 0;
    int right = nums.length-1;
    while (left < right) {
    
    
        char temp = sortedNums[left];
        sortedNums[left] = sortedNums[right];
        sortedNums[right] = temp;
        left ++;
        right --;
    }

    for (int i = 0; i < nums.length-1; i++) {
    
    
        if (nums[i] != sortedNums[i]) {
    
    
            char swapBig = sortedNums[i];
            for (int j = nums.length - 1; j >= i+1; j--) {
    
    
                if (nums[j] == swapBig) {
    
    
                    nums[j] = nums[i];
                    nums[i] = swapBig;
                    return Integer.valueOf(new String(nums));
                } 
            }
        }
    }
    return num;
}

方法2欲張り法

ソート方法を学んだ後、欲張り法を再び理解しやすくなります。元の整数を順番にトラバースします。ビットごとに、大きい数(ソート方法の最初の異なる数に対応)があるかどうかを確認します。ある場合は、交換する必要がある数の小さい方です。 1。どちらを変更すればよいですか?後ろの最大の数字に置き換える必要があります。次の質問は、後ろで最大の数を見つける方法ですか?最初に最後の番号の添え字を記録できるので(最後の理由は後ろから並べ替える理由と同じです)、ここで後ろの最大の番号を見つけるのに便利です。以下はコードです。

public int maximumSwap(int num) {
    
    

    char[] nums = String.valueOf(num).toCharArray();

    int[] lastIndex = new int[10];
    for (int i = 0; i < nums.length; i++) {
    
    
        lastIndex[nums[i] - '0'] = i;
    }

    for (int i = 0; i < nums.length-1; i++) {
    
    
        for (int d = 9; d >= nums[i] - '0' + 1; d--) {
    
    
            if (lastIndex[d] > i) {
    
    
                char temp = nums[lastIndex[d]];
                nums[lastIndex[d]] = nums[i];
                nums[i] = temp;
                return Integer.valueOf(new String(nums));
            }
        }
    }
    return num;
}

おすすめ

転載: blog.csdn.net/qq_41512783/article/details/111712811