百度面试题——01排序
分类:Interview
题目:
给定一个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
分析:
对于每一个01字符串都是一个非递减排序,最终的结果为0···01···1,所以,只需从右往左遍历,遇到0则从左边取一个1进行交换,直到头指针和尾指针相等。
算法代码:
int * sort(char **allString, int stringNumber) { int changingTimes[stringNumber]; for (int i = 0; i < stringNumber; ++i) { changingTimes[i] = sort01(allString[i], (int)strlen(allString[i])); } return changingTimes; } int sort01(char stringOf01[], int number) { int minChangingTimes; int head = 0; int tale = number; while (head < tale) { if ('1' == stringOf01[head]) { while ('0' != stringOf01[tale]) { --tale; } if (head >= tale) { break; } //exchange ++minChangingTimes; } ++head; --tale; } return minChangingTimes; }
测试代码:
// // main.cpp // sort01 // // Created by Jiajie Zhuo on 2017/4/10. // Copyright © 2017年 Jiajie Zhuo. All rights reserved. // #include <iostream> #define MAXSTRLEN 1000000 using namespace std; int * sort(char **allString, int stringNumber); int sort01(char stringOf01[], int number); int main(int argc, const char * argv[]) { cout << "Please enter the nubmer of 01: "; int number; cin >> number; char *stringOf01[number]; cout << "Please enter the string of 01: "; char *tempString;// = new char[MAXSTRLEN]; for (int i = 0; i < number; ++i) { cin >> tempString; stringOf01[i] = tempString; } int *changingTimes = sort(stringOf01, number); for (int i = 0; i < number; ++i) { cout << changingTimes[i] << endl; } // delete [] tempString; return 0; }
如果有收获,可以请我喝杯咖啡!