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

本文介绍了一种高效算法,用于计算将由0和1组成的字符串排序为非递减序列所需的最少交换次数。该算法统计字符串中0的数量,并计算位于所有0左侧的1的数量作为答案。

题目地址: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 }

 

 

转载于:https://www.cnblogs.com/sxiszero/p/4449614.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值