zl程序教程

您现在的位置是:首页 >  其他

当前栏目

LeetCode·每日一题·679.最大交换·贪心

LeetCode 最大 每日 贪心 交换
2023-09-27 14:26:29 时间

题目

 

思路

解题思路
【模拟】

  • 1.首先通过sprintf()函数将数字转换为字符串为了后续操作方便。
  • 2.将转换为字符串中的数字进行逐一交换。
  • 3.将此时得到的字符串转换为数字进行取大处理并保留较大值。
  • 4.将字符串进行复原,使得后续的比较每次都是在原字符串的基础上进行的。
  • 5.所有的情况都比较完成,返回最大值,即为结果。

【贪心】
贪心法一句话总结:每一位数字应该不小于所有排它后面的数字,否则找最大的且排最后面的数字与之交换

直观看就是,寻找第一个上升位置之后的最大数位置,并尽量与前面的数互换,互换的原则是:比自己小

作者:xun-ge-v
链接:https://leetcode.cn/problems/maximum-swap/solution/-by-xun-ge-v-bfjf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码

【模拟】

void swap(char *nums, int i, int j) { // 通过函数实现字符串中数字的交换。
    int temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
    return ;
}

int maximumSwap(int num){
    char str[10];
    sprintf(str, "%d", num); // 将数字转换为字符串,便于后续的操作。

    int len = strlen(str);
    int i;
    int j;
    int max = num;

    for (i = 0; i < len; i++) {
        for (j = len - 1; j > 0; j--) {//枚举所有交换可能保存最大值
        swap(str, i, j); // 交换字符串中的两个值的位置。
        max = fmax(max, atoi(str));
        swap(str, i, j); // 复原字符串中两个值的位置,为了后续的重新比较。
        }
    }
    return max;
}

作者:xun-ge-v
链接:https://leetcode.cn/problems/maximum-swap/solution/-by-xun-ge-v-bfjf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【贪心】

void swap(char *nums, int i, int j) { // 通过函数实现字符串中数字的交换。
    int temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
    return ;
}

int maximumSwap(int num){
    char str[10];
    sprintf(str, "%d", num); // 将数字转换为字符串,便于后续的操作。

    int len = strlen(str);
    int max;//保存最大数位置位置,当然必须是上升位之后的最大数
    bool logo = false;//记录是否有上升位

    for (int i = 1; i < len; i++) {//遍历判断是否存在上升位
        if(logo == false && str[i-1] < str[i])如果存在上升位就记录当前位置
        //并且后序不需要再比较有没有上升位了,应该有一个就必须有换位
        {
            max = i;
            logo = true;
        }
        if(logo)//存在上升位,保存上升位之后的最大数下标
        {
            if(str[max] <= str[i])
                max = i;
        }
    }
    if(logo)//排出开始位置相同数
    {
        int i = 0;
        while(str[max] <= str[i]) i++;
        swap(str, max, i);//交换位置
    }

    sscanf(str, "%d", &num);//输出
    return num;
}



作者:xun-ge-v
链接:https://leetcode.cn/problems/maximum-swap/solution/-by-xun-ge-v-bfjf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。