【力扣每日一题】力扣670最大交换

题目来源

力扣670最大交换

题目概述

给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。

解题思路

  1. 我们能确定 组成的最大数从最高位到最低位应该是降序排序的;
  2. 我们只需要知道每一位应该填入的数字,并且找到不符合的最高数位i;
  3. 交换i与最后一个最大值j即可。

代码实现

java实现

public class Solution {
    public int maximumSwap(int num) {
		// 统计每个数出现的次数,用于找最大值
        int[] count = new int[10];
		// 将入参转为数组
        int[] numberToArray = new int[8];
		// 记录入参长度
        int length = 0;
        int n = num;
        while (n > 0) {
            int current = n % 10;
            numberToArray[length++] = current;
            count[current]++;
            n /= 10;
        }
		// 最高位在最后
        int currentIndex = length - 1;
		// 最大值为9
        int maxIndex = 9;
        while (maxIndex >= 0) {
			// 寻找当前最大值
            while (maxIndex >= 0 && count[maxIndex] == 0){
                maxIndex--;
            }
			// 如果当前最大值和当前最高位符合,继续找
            if (currentIndex >= 0 && maxIndex == numberToArray[currentIndex]) {
                count[maxIndex]--;
                currentIndex--;
            }else {
                break;
            }
        }
		// 符合最大数要求,直接返回
        if (currentIndex == 0) {
            return num;
        }
		// 交换找到的最高位和其后最大值
        for (int i = 0; i < currentIndex; i++) {
            if (numberToArray[i] == maxIndex) {
                int temp = numberToArray[i];
                numberToArray[i] = numberToArray[currentIndex];
                numberToArray[currentIndex] = temp;
            }
        }
		// 组成结果返回
        int result = 0;
        for (int i = length - 1; i >= 0; i--) {
            result *= 10;
            result += numberToArray[i];
        }
        return result;
    }
}

c++实现

class Solution {
public:
    int maximumSwap(int num) {
		// 记录每个数出现的次数
        int count[10] = {0};
		// 入参转数组
        int numberToArray[8] = {0};
		// 记录入参长度
        int length = 0;
        int n = num;
        while (n > 0) {
            int current = n % 10;
            numberToArray[length++] = current;
            count[current]++;
            n /= 10;
        }
		// 最高位在最后
        int currentIndex = length - 1;
		// 最大值为9
        int maxIndex = 9;
        while (maxIndex >= 0) {
			// 寻找当前最大值
            while (maxIndex >= 0 && count[maxIndex] == 0){
                maxIndex--;
            }
			// 如果当前最大值和当前最高位符合,继续找
            if (currentIndex >= 0 && maxIndex == numberToArray[currentIndex]) {
                count[maxIndex]--;
                currentIndex--;
            }else {
                break;
            }
        }
		// 符合最大数要求,直接返回
        if (currentIndex == 0) {
            return num;
        }
		// 交换找到的最高位和其后最大值
        for (int i = 0; i < currentIndex; i++) {
            if (numberToArray[i] == maxIndex) {
                int temp = numberToArray[i];
                numberToArray[i] = numberToArray[currentIndex];
                numberToArray[currentIndex] = temp;
            }
        }
		// 组成结果返回
        int result = 0;
        for (int i = length - 1; i >= 0; i--) {
            result *= 10;
            result += numberToArray[i];
        }
        return result;
    }
};

你可能感兴趣的:(leetcode,算法,java,c++)