在CodePen上实现了所需的HackerRank结果,但在HackerRank上却变幻莫测。

时间:2019-01-02 22:41:40

标签: quicksort

我正在研究HackerRank上的Quicksort2问题。我无法弄清楚它如何让我输出解决方案。

我尝试在创建排序数组时进行console.log,将排序数组的数组和转换为字符串的数组的数组记录下来。从processData函数返回似乎无效。

function checkSort(arr) {
    for (let i = 0; i < arr.length - 1; i++) {
        if (arr[i] > arr[i + 1]) return false;
    }
    return true;
}

function processData(input) {
    let sortedArrays = [];
    quickSort(input);

    function quickSort(input) {

        if (input.length <= 1) return input;

        let pivot = [input[0]];
        let left = [], right = [];
        for (let i = 1; i < input.length; i++) {
            input[i] < pivot ? left.push(input[i]) : right.push(input[i]);
        }

        let newArr = quickSort(left).concat(pivot, quickSort(right));
        if (checkSort(newArr)) sortedArrays.push(newArr);
        return newArr;
    }
    console.log(sortedArrays);
}

我希望它与HackerRank的期望输出匹配。

1 个答案:

答案 0 :(得分:1)

您的实现存在两个问题:

下面是任务描述中的引号:

  

在此挑战中,每当分区方法完成时,即每当两个子数组以及数据透视表合并在一起时,就打印数组。

但是,您尝试在问题出现时为每个步骤打印最终排序的数组sortedArrays而不是子数组。因此,在返回子数组之前,请打印子数组newArr。不要忘记使用join格式化输出。

另一句话:

  

会有两行输入:

     

数组的大小

     

数组的n个数字

您的processData期望一个已解析的输入,即可以使用的数组。如果它接收到原始输入(两行数据),则应相应地对其进行解析。例如,可以将它们解析如下:

...
function processData(input) {
    var lines = input.split('\n')
    var len = lines[0]
    var arr = lines[1].split(' '); 
...

因此您的固定代码如下:

function processData(input) {
    var lines = input.split('\n')
    var len = lines[0]
    var arr = lines[1].split(' ');
    quickSort(arr);
        function quickSort(input) {

        if (input.length <= 1) return input;

        let pivot = [input[0]];
        let left = [], right = [];
        for (let i = 1; i < input.length; i++) {
            input[i] < pivot ? left.push(input[i]) : right.push(input[i]);
        }

        let newArr = quickSort(left).concat(pivot, quickSort(right));
        // print the subarray once the partitioning for this step has finished
        console.log(newArr.join(' '))
        return newArr;
    }
}