[百度2015春季实习生招聘附加题] 01排序

题目地址:http://www.nowcoder.com/questionTerminal/9959e3aafd9f405db147df1495961fee?orderByHotValue=0&done=0&pos=1

给定一个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 }

 

 

你可能感兴趣的:(招聘)