思路:借助一个stack结构,将int的num转成一个vector<int> 进行存储。再借助一个vector<int>, 对前一个vector里面的元素由大到小排序排序。从0-size() 比较这两个vector,确定位置变化的位置这两个元素。交换它们,最后把vector里面的元素按int方式输出即可
T(n)=O(n); S(n)=O(n);
int maximumSwap(int num) {
if(num<10)return num;
std::stack<int> st; //暂时保存num中的数字
std::vector<int> digits; //保存num中的数字
std::vector<int> temp; // 寻找需要交换的元素
bool needSwap=false; //是否需要交换
//将num的数字取出来,按高位在小标小的位置顺序保存到vector中
while(num/10!=0){
st.push(num%10);
num/=10;
}
st.push(num);
// num -> vector
while(!st.empty()){
digits.push_back(st.top());
st.pop();
}
for(auto digit : digits){ // digits中的元素复制到temp中
temp.push_back(digit);
}
bool isSmaller(int num1, int num2);
std::sort(temp.begin(), temp.end(), isSmaller); //temp从大到小排序,sort默认从小到大
size_t i=0; //找出需要交换的最高位元素
for(; i<temp.size(); ++i)
if(temp[i]!=digits[i]){
needSwap=true;
break;
}
if(needSwap){
int j=0;
for(j=digits.size()-1; j>=0; --j) //必须从低位开始找,找出需要交换的那个元素
if(digits[j]==temp[i])break;
std::swap(digits[i], digits[j]); //交换操作
}
num=0;
for(int i=0; i<digits.size(); ++i) // 以int的方式输出交换以后的值
num=num*10+digits[i];
return num;
}
bool isSmaller(int num1, int num2)
{
return num1 > num2;
}