简单介绍,就是使用一次机会,将给定数字交换,两数位,交换后的数最大
######################################################
只使用一次机会,记录每次遍历的 [0...i]中的最大数的下标,如果该下标对应的数 大于list[i]则替换,结束
根据题意,我们应当将大的数放置在高位,而当有数值相同的多个大数时,我们应当选择低位的数字。
这句话,我解释一下
比如 99815 ---> 9951
当遍历了两个 99 不用变化 继续选择低位 遍历 相当于 15 -->51
####################################################
int solution(int num){
//num 99185
// 0 1 2 3
//list 5 8 1 9 9
std::vector<int> list;
while(num > 0){
list.push_back(num%10);
num /= 10;
}
int n = list.size();
int* idx = new int[n];
for(int i =0, j =0; i < n; ++i){
if(list[i] > list[j]){
j = i;
}
idx[i] = j;
}
//只换一次 将“高位小的那个数位上的数替换成最大的数” break 跳出 结束
for(int i = n -1; i >= 0; --i){
if(list[idx[i] != list[i]){
int x = list[idx[i]];
list[idx[i]] = list[i];
list[i] = x;
break;
}
}
int ans = 0;
for(int i = n - 1; i >= 0; i--){
ans = ans *10 + list[i];
}
return ans;
####################################################
总结:秒就妙在 通过下标 记录了[0 …i] 中最大的那个数字。
可以好好体会