670. 最大交换

 

670. 最大交换

 

 

 

贪心O(n):

  

class Solution {
public:
    int maximumSwap(int num) {
        string s=to_string(num);
        map<char,int>mp;
        for(int i=0;i<s.length();i++)
            mp[s[i]]=i;//找出每个数最后一次出现的位置
        for(int i=0;i<s.size();i++)
        {
            for(int j=9;j>(s[i]-'0');j--)//每个数后面看是否有比他大的数(从9开始最优,到它本身结束)
            {
                if(i<mp[j+'0'])有就交换,返回值
                {
                    swap(s[i],s[mp[j+'0']]);
                    return value(s);
                }
            }
        }
        return num;
    }
    int value(string s)//求字符串的int值
    {
        int sum=0;
        for(int i=0;i<s.length();i++)
        {
            sum=sum*10+(s[i]-'0');
        }
        return sum;
    }
};

 

暴力(O(n^2)):

class Solution {
public:
    int maximumSwap(int num) {
        int num1=num;
        if(num<=9)
            return num;
        char ss[10]={'\0'};
        int ops;//判断是几位数
        if(num<=9)
            ops=1;
        else if(num<=99)
            ops=2;
        else if(num<=999)
            ops=3;
        else if(num<=9999)
            ops=4;
        else if(num<=99999)
            ops=5;
        else if(num<=999999)
            ops=6;
        else if(num<=9999999)
            ops=7;
        else if(num<=99999999)
            ops=8;
        else
            ops=9;
       // cout<<"ops="<<ops<<endl;
        int oo=-1;
        for(int i=ops-1;i>=0;i--)
        {
            int g=num/pow(i);
            num=num-g*(pow(i));
            oo++;
            ss[oo]=char(g+'0');//手动int转string
        }

        int ans=num1;
        for(int i=0;i<ops;i++)
        {
           // cout<<"s="<<s<<endl;
            for(int j=0;j<ops;j++)
            {
                if(i!=j){
                char s[100]={'\0'};
                strcpy(s,ss);//算出每次交换后的值,求最大,组合数
                swap(s[i],s[j]);
                ans=max(ans,value(s,ops));
                }
            }
        }
        return ans;
    }
    int value(char s[],int ops)//字符串转int
    {
        int sum=0;
        for(int i=0;i<ops;i++)
        {
            sum=sum*10+(s[i]-'0');
        }
        return sum;
    }
    int pow(int a)//10的a次方
    {
        int ji=1;
        for(int i=0;i<a;i++)
        {
            ji*=10;
        }
        return ji;
    }
};

 

posted @ 2020-06-19 17:20  branna  阅读(161)  评论(0编辑  收藏  举报