【プログラミング問題】01列並べ替え
タイトル
01列(「0」または「1」からなる文字列のみ)を指定し、この数字列を「非減算」シーケンスに並べ替えたいのですが、少なくとも何回交換する必要がありますか?入力説明:入力データの最初の行は正の整数T(T<=100)で、Tグループのテストデータがあることを示します.次のT行は、各行に01列が与えられる.データ保証:50%の文字列長が[1100]95%の文字列長が[110000]100%の文字列長が[110000]
≪出力の説明|Output Description|oem_src≫:テスト・データのセットごとに、「≪非減算順序|Non-Reduction Order|oem_src≫」に並べられた最小交換回数を出力します.出力のグループごとに1行を占めます.
入力例:3 01 10 110
出力例:0 1
ぶんせき
高速ソートの考え方を用いて,2つのポインタiとj,iを用いて左から右へ走査し,jを右から左へ走査した.左が1に、右が0に遭遇したときに交換します.
コード#コード#
01列(「0」または「1」からなる文字列のみ)を指定し、この数字列を「非減算」シーケンスに並べ替えたいのですが、少なくとも何回交換する必要がありますか?入力説明:入力データの最初の行は正の整数T(T<=100)で、Tグループのテストデータがあることを示します.次のT行は、各行に01列が与えられる.データ保証:50%の文字列長が[1100]95%の文字列長が[110000]100%の文字列長が[110000]
≪出力の説明|Output Description|oem_src≫:テスト・データのセットごとに、「≪非減算順序|Non-Reduction Order|oem_src≫」に並べられた最小交換回数を出力します.出力のグループごとに1行を占めます.
入力例:3 01 10 110
出力例:0 1
ぶんせき
高速ソートの考え方を用いて,2つのポインタiとj,iを用いて左から右へ走査し,jを右から左へ走査した.左が1に、右が0に遭遇したときに交換します.
コード#コード#
#include <iostream>
#include <string>
using namespace std;
int func(string str){
int len = str.length();
int i = 0, j = len-1;
int cnt = 0;
while(i < j){
while(i < j && str.at(i) == '0') i++;
while(i < j && str.at(j) == '1') j--;
if(i < j){// , 。
i++;
j--;
cnt++;
}
}
return cnt;
}
int main(){
int T;
cin >> T;
while(T--){
string str;
cin >> str;
cout << func(str) << endl;
}
return 0;
}