zoukankan      html  css  js  c++  java
  • 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]={''};
            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]={''};
                    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;
        }
    };
  • 相关阅读:
    【Linux 日常】设置动态链接库目录
    某站视频python抓取: m3u8转mp4
    GDB 主要调试命令
    算法【查找一】
    算法【排序四】
    算法【排序三】
    Vim常用命令整理
    【OpenCV】贝叶斯之肤色分割模型
    算法【排序二】
    算法【排序一】
  • 原文地址:https://www.cnblogs.com/Vampire6/p/13164119.html
Copyright © 2011-2022 走看看