百度面试题——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;
}
如果有收获,可以请我喝杯咖啡!