2024.1.22每日一题

LeetCode

670.最大交换

670. 最大交换 - 力扣(LeetCode)

题目描述

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

示例 1 :

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

示例 2 :

输入: 9973
输出: 9973
解释: 不需要交换。

注意:

  1. 给定数字的范围是 [0, 108]

思路

看到的题解,通俗易懂

670. 最大交换 - 力扣(LeetCode)

代码

C++
class Solution {
public:
    int maximumSwap(int num) {
        string chars = to_string(num); // 转换成字符串
        int n = chars.length();

        int maxIdx = n - 1;
        int* maxIndex = new int[n];

        for (int i = n - 1; i >= 0; i--) {
            if (chars[i] > chars[maxIdx]) {
                maxIdx = i;
            }
            maxIndex[i] = maxIdx;
        }

        for (int i = 0; i < n; i++) {
            if (chars[maxIndex[i]] != chars[i]) {
                char temp = chars[maxIndex[i]];
                chars[maxIndex[i]] = chars[i];
                chars[i] = temp;
                break;
            }
        }
        return stoi(chars);
    }
};
Java
class Solution {
    public int maximumSwap(int num) {
        char[] chars = Integer.toString(num).toCharArray(); // 将数组转为字符串数组,方便遍历
        int n = chars.length;
        int maxIdx = n - 1;
        int[] maxArr = new int[n]; // 记录每个数对应的最大值的索引
        for(int i = n - 1;i >=0;i--){
            if(chars[i] > chars[maxIdx]){
                maxIdx = i; 
            }
            maxArr[i] = maxIdx; // 将索引存入数组
        }
        for(int i = 0; i < n; i++){
            if(chars[maxArr[i]] != chars[i]){
                char temp = chars[maxArr[i]];
                chars[maxArr[i]] = chars[i];
                chars[i] = temp;
                break;
            }
        }
        return Integer.parseInt(new String(chars));
    }
}

2024.1.22每日一题_第1张图片

image-20240122093416203

你可能感兴趣的:(算法学习,#,每日一题,算法,leetcode)