leecode | 670最大交换

简单介绍,就是使用一次机会,将给定数字交换,两数位,交换后的数最大

######################################################
只使用一次机会,记录每次遍历的 [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 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] 中最大的那个数字。
可以好好体会
leecode | 670最大交换_第1张图片

你可能感兴趣的:(C++,leecode,综合部,leetcode)