上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

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

guduadmin311月前

题目来源

力扣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;
    }
};

网友评论

搜索
最新文章
热门文章
热门标签
 
 梦见蛇排列五解梦号码  梦见雪发大财  周公解梦大全完整版免费下载