leetcode每日一题【最大交换】2022/09/13 【缺贪心算法】

一、670. 最大交换【中】

1、题目:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-swap/

2、思路一(错误):

粗略的想法:将最大的那个数放到第一个就行。失败的案例显然表示:若第一个数字已经是最大,那就要把第一个之后最大的数字和第二个交换;若第二个数字已经最大,那就找到第三个…以此类推。

代码:

//s:O() t:O()
class Solution {
public:
    int maximumSwap(int num) {
        string s = to_string(num);
        int max = -1,pos = 0;
        for(int i=0;i<s.size();i++){
            if(int(s[i]-'0')>max){
                max = int(s[i]-'0');
                pos = i;
            }
        }
        s[pos] = s[0];
        s[0] = max+'0'; 
        return atoi(s.c_str());
    }
};

在这里插入图片描述

3、思路二

  • 创建两个数组,第一个origin按位存放原始数字,第二个数组按顺序存放原始数字
  • 从origin最高位以i循环,如果origin[i]和sorted[i]相同,即表示该位已经最大,不需要被换,当且仅当不相等时,表示后续的数字才需要被更换。

例子:

在这里插入图片描述

代码:

//s:O() t:O()
class Solution {
public:
    int maximumSwap(int num) {
        int thenum = num;
        int current;
        vector<int> sorted; // 第一个数组 排序所有数字
        vector<int> origin; // 第二个数据 保持原数字
        // 按位记录各位数字
        while(thenum!=0){
            current = thenum%10;
            sorted.push_back(current);
            origin.push_back(current);
            thenum/=10;
        }
        // 从小到大排序sorted
        sort(sorted.begin(),sorted.end());
        
        int flag = 0; // 找到了不是数字最大的最高位 的标志
        // pos1 即应该被交换的位置
        // pos2 最大的位置
        int max = -1,pos1 = sorted.size(),pos2 = sorted.size();
        for(int i=sorted.size()-1;i>=0;i--){
            if(flag == 0){
                if(sorted[i]==origin[i]){
                    pos2 = i;
                    continue;
                }else{
                    pos2 = i;
                    flag = 1;
                }
            }
            if(origin[i]>=max){
                    max = origin[i];
                    pos1 = i;
                }
        }

        // 只要可以交换,就交换
        if(pos2 !=sorted.size() && pos1 !=sorted.size()){
            origin[pos1] = origin[pos2];
            origin[pos2] = max;
        }
        
        // 开始按位处理结果
        int result = origin[0];
        int mul = 10;
        for(int i=1;i<origin.size();i++){
            result = origin[i]*mul+result;
            mul *=10;
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值