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; } };