1. 程式人生 > >一些有意思的js程式設計題

一些有意思的js程式設計題

Q : 有個可憐的傢伙,由於某些原因無法使用js中的原型方法Array.prototype.sort,於是他寫下了如下的程式碼,希望奇蹟會發生:

const miracleSort = arr =>
{
    var result = [...arr]
    var sorted = false
    do
    {
        sorted = true
        for (var i = 1;i < result.length;++i)
            if (result[i] < result[i - 1])
            {
                sorted = false
break } } while (!sorted) return result }

作為js 大神,請幫助這個可憐的傢伙
要求 :呼叫方法miracleSort輸入正整數陣列,輸出排序後的陣列 ,例如 :
miracleSort([4,2,6,8,5]) //輸出[2 ,4 ,5,6 ,8]

A :

const arrayIterator = Array.prototype[Symbol.iterator]
const miracleIterator = function()
{
let arr = this.slice() let swapped do { swapped = false for (let i = 0; i < arr.length - 1; ++i) { if (arr[i] > arr[i + 1]) { [arr[i], arr[i + 1]] = [arr[i + 1], arr[i]] swapped = true } } } while (swapped) return arrayIterator.call(arr) } Array
.prototype[Symbol.iterator] = miracleIterator

本題的突破口在與...運算子會呼叫Iterator介面,解決辦法就是重寫Array的Symbol.iterator方法。因此第三行var result = [...arr]得到的就是排過序的陣列。

Q : 如何在不使用Array.prototype.reverse方法的條件下翻轉陣列,並且程式碼位元組數不超過30?
A : reserve=a=>a.map(a.pop,[...a])
因為函式名是固定的,所以實際上可用的位元組就22個。想了很久,試過用a.sort(_=>1) 但是陣列長度超過12的話sort會使用快速排序。