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;
        }
    };
  • 相关阅读:
    vue的特点
    暴力卸载低版本vuecli
    C#实现汉字转换为拼音缩写的代码
    .net 发送手机短信息
    js 小小jquery等比例缩放图片效果
    Android应用程序运行机制解析
    大型网站的架构设计问题大型高并发高负载网站的系统架构
    《UDP原理》
    《计算机网络中port和socket的作用》
    《线程并发》
  • 原文地址:https://www.cnblogs.com/Vampire6/p/13164119.html
Copyright © 2011-2022 走看看