我真的怀疑他是不是难度等级评错了,因为感觉没到中级,总之先看题吧
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736 输出: 7236 解释: 交换数字2和数字7。
示例 2 :
输入: 9973 输出: 9973 解释: 不需要交换。
注意:
- 给定数字的范围是 [0, 10^8]
这个题只要你思路对了很快就能写出来
我们要至多可以交换一次数字中的任意两位,得到的最大值,那肯定是把大的数字放在高位,小的数字放在低位,所以思路就是从高位向低位历遍,发现某位的数字比右边的数字最大值小就交换位置,然后返回值。
4123->4321 因为1的右边最大是3所以1和3交换位置
int maximumSwap(int num) {
char* p = (char*)calloc(10, sizeof(char));
int i = 0;
int su=num;
while (num)
{
p[i++] = num % 10;
num /= 10;
}
for (int j = i - 1; j > 0; j--)
{
int max = j;
for (int x = j - 1; x >= 0; x--)
if (p[max] < p[x])
max = x;
else if (p[max] == p[x] && max != j)
max = x;
if (max != j)
{
int a = p[j];
p[j] = p[max];
p[max] = a;
int sum = 0;
while (i-1>=0)
{
sum = sum * 10 + p[i-1];
i--;
}
return sum;
}
}
return su;
}
AC