LeetCode670.最大交换

我真的怀疑他是不是难度等级评错了,因为感觉没到中级,总之先看题吧

给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。

示例 1 :

输入: 2736
输出: 7236
解释: 交换数字2和数字7。

示例 2 :

输入: 9973
输出: 9973
解释: 不需要交换。

注意:

  1. 给定数字的范围是 [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

LeetCode670.最大交换_第1张图片

你可能感兴趣的:(算法,leetcode,c语言)