做完华为的模拟机考题,趁着还记得题目记录下来。
问题描述是,给定一个乱序存放着[0, n)的数组,提供一个swap_with_zero(int* array, int len, int n)函数,该函数可以交换数组中n和0的位置。要求调用这个函数完成数组排序(默认应该是升序)。
比较坑的一点是刚开始没看到void swap_with_zero(int* array, int len, int n)前面还有一个extern关键字,还自己把这个函数实现了,白白浪费时间 ......
实际上这题就是一个交换排序,如果知道的同学一下就做完了,像我这种算法渣渣还得思考那么几十分钟 0 _0
而且自己在IDE上实现的交换函数明明可以跑出正确结果,但是放到OJ跑出来的却是奇奇怪怪的结果...最后还是得根据报错修改函数。
废话不多说,代码如下:
#include <iostream>
using namespace std;
/**
* 交换数组里n和0的位置
* array: 存储[0-n)的数组
* len: 数组长度
* n: 数组里要和0交换的数
*/
extern void swap_with_zero(int* array, int len, int n){
for(int i = 0; i < len; i++){
int z_ind = 0;
int n_ind = 0;
int temp = 0;
if(array[i] == n){
n_ind = i;
}
else if(array[i] == 0){
z_ind = i;
}
temp = array[n_ind];
array[n_ind] = array[z_ind];
array[z_ind] = temp;
}
}
class Solution {
public:
/**
* 调用方法swap_with_zero来对array进行排序
*/
void sort(int* array, int len) {
if(len <= 1)
return;
//将0交换到未排序序列的最低位
for(int i = 0; i < len; i++){
swap_with_zero(array, len, array[i]);
int Min = len;
for(int j = i + 1; j < len; j++){
if(array[j] <= Min)
Min = array[j];
}
swap_with_zero(array, len, Min);
}
}
};
int main()
{
int array[7] = {1, 4, 5, 2, 0, 3, 6};
Solution ans;
ans.sort(array, 7);
for(int i = 0; i < 7; i++){
cout << array[i] << " ";
}
}
然而这个sort函数放到OJ上跑0到9的乱序数组竟然会输出0到10,非常神奇,于是将Min改成了array[len - 1],结果输出1,2,3,4,5,6,7,8,9,0,于是又在末尾添加了一个将0交换到最低位的循环,这才通过测试......估计200分的题只能拿120左右了 #° 皿°)
迫切地想知道后台的swap_with_zero函数的具体实现......