题目
思路
解题思路
【模拟】
- 1.首先通过sprintf()函数将数字转换为字符串为了后续操作方便。
- 2.将转换为字符串中的数字进行逐一交换。
- 3.将此时得到的字符串转换为数字进行取大处理并保留较大值。
- 4.将字符串进行复原,使得后续的比较每次都是在原字符串的基础上进行的。
- 5.所有的情况都比较完成,返回最大值,即为结果。
【贪心】
贪心法一句话总结:每一位数字应该不小于所有排它后面的数字,否则找最大的且排最后面的数字与之交换
直观看就是,寻找第一个上升位置之后的最大数位置,并尽量与前面的数互换,互换的原则是:比自己小
作者:xun-ge-v
链接:https://leetcode.cn/problems/maximum-swap/solution/-by-xun-ge-v-bfjf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码
【模拟】
void swap(char *nums, int i, int j) { // 通过函数实现字符串中数字的交换。
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
return ;
}
int maximumSwap(int num){
char str[10];
sprintf(str, "%d", num); // 将数字转换为字符串,便于后续的操作。
int len = strlen(str);
int i;
int j;
int max = num;
for (i = 0; i < len; i++) {
for (j = len - 1; j > 0; j--) {//枚举所有交换可能保存最大值
swap(str, i, j); // 交换字符串中的两个值的位置。
max = fmax(max, atoi(str));
swap(str, i, j); // 复原字符串中两个值的位置,为了后续的重新比较。
}
}
return max;
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/maximum-swap/solution/-by-xun-ge-v-bfjf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【贪心】
void swap(char *nums, int i, int j) { // 通过函数实现字符串中数字的交换。
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
return ;
}
int maximumSwap(int num){
char str[10];
sprintf(str, "%d", num); // 将数字转换为字符串,便于后续的操作。
int len = strlen(str);
int max;//保存最大数位置位置,当然必须是上升位之后的最大数
bool logo = false;//记录是否有上升位
for (int i = 1; i < len; i++) {//遍历判断是否存在上升位
if(logo == false && str[i-1] < str[i])如果存在上升位就记录当前位置
//并且后序不需要再比较有没有上升位了,应该有一个就必须有换位
{
max = i;
logo = true;
}
if(logo)//存在上升位,保存上升位之后的最大数下标
{
if(str[max] <= str[i])
max = i;
}
}
if(logo)//排出开始位置相同数
{
int i = 0;
while(str[max] <= str[i]) i++;
swap(str, max, i);//交换位置
}
sscanf(str, "%d", &num);//输出
return num;
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/maximum-swap/solution/-by-xun-ge-v-bfjf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。