看到題目的時候,以為類似插入排序,比較第i個元素和第i-1個元素,
如果第i個元素比第i-1個元素小,則不交換
如果第i個元素比第i-1個元素大,則交換第i個元素和第i-1個元素
繼續比較第i-1個元素與前一個元素,直到前一個元素大為止
交換元素次大於等於k則停止
但對測試用例
1234 3
則出現問題,如果按照上述方法得到答案為3214,
但正確答案是4321,直接將第4個元素往前交換
故在上面基礎上改進得
當掃描第i個元素時,則要取出[i,i+k+1)之間的最大元素,然後將最大元素往前交換,則交換後第i個元素肯定是最大的
#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; int main(){ string s; int k; cin >> s >> k; int len = s.length(); for(int i = 0 ; i < len; ++ i){ int maxIndex = i; for(int j = i +1; j < min(len,i+k+1); ++ j){ if(s[maxIndex] < s[j]) maxIndex = j; } for(int j = maxIndex; j > i; --j){ swap(s[j],s[j-1]); k--; } } cout<<s<<endl; }