给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736 输出: 7236 解释: 交换数字2和数字7。
示例 2 :
输入: 9973 输出: 9973 解释: 不需要交换。
注意:
- 给定数字的范围是 [0, 108]
总结:在做题目过程中主要是将整数进行拆解的处理,将整数转化为字符串进行排位处理,以及在处理的时候进行对比大小记得将字符串用 atoi()函数转回整数形。
方法一:遍历
#define MAX(a,b) ((a)>(b)?(a):(b)) #define MAX_LEN 32 static inline void swap(char* a,char* b){ char c=*a; *a=*b; *b=c; } int maximumSwap(int num){ char charArray[MAX_LEN]; int n=stelen(charArray); int maxNum=num; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ swap(&charArray[i],&charArray[j]); maxNum=MAX(maxNum,atoi(charArray)); swap(&charArray[i],&charArray[j]); } } return maxNum; }
方法二:贪心算法
利用贪心算法将右边较大的数字与左边较小的数字进行交换,这样就可以保证得到的整数值最大。
#define MAX_LEN 32
static inline void swap(char* a, char* b) {
char c = *a;
*a = *b;
*b = c;
}
int maximumSwap(int num) {
char charArray[MAX_LEN];
sprintf(charArray, "%d", num);
int n = strlen(charArray);
char maxIdx = n - 1;
int idx1 = -1, idx2 = -1;
for (int i = n - 1; i >= 0; i--) {
if (charArray[i] > charArray[maxIdx]) {
maxIdx = i;
} else if (charArray[i] < charArray[maxIdx]) {
idx1 = i;
idx2 = maxIdx;
}
}
if (idx1 >= 0) {
swap(&charArray[idx1], &charArray[idx2]);
return atoi(charArray);
} else {
return num;
}
}