LeetCode670.最大交换

发布时间:2024年01月23日

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

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

示例 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

文章来源:https://blog.csdn.net/2301_79551553/article/details/135760335
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。