我真的怀疑他是不是难度等级评错了,因为感觉没到中级,总之先看题吧
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736 输出: 7236 解释: 交换数字2和数字7。
示例 2 :
输入: 9973 输出: 9973 解释: 不需要交换。
注意:
这个题只要你思路对了很快就能写出来
我们要至多可以交换一次数字中的任意两位,得到的最大值,那肯定是把大的数字放在高位,小的数字放在低位,所以思路就是从高位向低位历遍,发现某位的数字比右边的数字最大值小就交换位置,然后返回值。
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