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
なるなどの反復要素がある場合は、27367
2と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;
}