[百度2015春季实习生招聘附加题] 01排序
给定一个01串(仅由‘ 0’或‘1’组成的字符串),现在想把这个数字串排序成“非递减”有序序列,请问至少需要多少次交换(任意两个位置交换)?
输入描述:
输入数据第一行是一个正整数T(T<=100),表示有T组测试数据; 接下来的T行,每行给出01串。 数据保证—— 50%的字符串长度在[1,100 ] 95%的字符串长度在[1,10000] 100%的字符串长度在[1,1000000]
输出描述:
对于每组测试数据,请输出排成“非递减有序序列”的最小交换次数。 每组输出占一行。
输入例子:
3 01 10 110
输出例子:
0 1 1
题解:
因为输入的序列仅由0和1组成,现在要求排序成非递减序列,即”0”全部在左边,“1”全部在右边。
所以可以统计a[i]中"0"的个数num,那么从0到num中如果存在“1”,就必然存在一次交换,统计的从0到num中"1"的数量即为答案。
时间复杂度O(n)。100%数据规模max_length=1e6,可以AC。
代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 using namespace std; 5 const int N=1e6+131; 6 char a[N]; 7 int num; 8 9 int main() 10 { 11 int T; 12 13 scanf("%d",&T); 14 while(T--) { 15 num=0; 16 scanf("%s",a); 17 int len=strlen(a); 18 for(int i=0;i<len;i++) { 19 if(a[i]=='1') num++; 20 } 21 int p=len-num; 22 num=0; 23 for(int i=0;i<p;i++) { 24 if(a[i]=='1') num++; 25 } 26 printf("%d\n",num); 27 } 28 }