簡體   English   中英

以特殊順序對數組進行排序

[英]Sort an array in a peculiar order

我一直在嘗試找出解決這個問題的方法,但似乎找不到正確的排序順序。

說明:

編寫一個以下列方式對數字列表進行排序的程序:

3,-2,1,0,-1,0,-2,1 => -2,-1,-2,0,0,3,1,1

'use strict';
let myNumbers = '3,-2,1,0,-1,0,-2,1';
// I receive the input as a string and split and map it into an array
let myNumbers = gets().split(',').map(Number);

我嘗試對所有小於零的整數按升序應用sort()方法,對上述整數進行相反的處理,但這並不是預期輸出中的順序。

在將sort()應用於0之后,我還嘗試拼接第一個數組,然后重新排列拼接部分並將其連接起來。 但是,這不適用於所有測試輸入。

另一個示例:3,-12,0,0,13,5,1,0,-2 => -12,-2,0,0,0,3,13,5,1

此順序的邏輯是什么? 謝謝。

因為這聽起來像是解決家庭作業問題或類似問題的解決方案,所以我將讓您編寫代碼:)但是,我要這樣做的方法是在數組的一次迭代中創建三個單獨的數組:

  1. 負數
  2. 0秒
  3. 正數

將數組壓在一起而不進行排序,您將獲得O(N)解決方案。

因此,根據涵蓋邏輯的sketrik答案,這是代碼:

 const myNumbers = '3,-2,1,0,-1,0,-2,1'; const arr = myNumbers.split(',').map(Number) const res = arr.filter(i => i < 0) .concat(arr.filter(i => i === 0)) .concat(arr.filter(i => i > 0)) console.log(res) 

這要歸功於Array.prototype的兩個非常基本的JS方法:

concatfilter 我無法比文檔更好地解釋它們,請查看!

但基本上,我正在做的是:

  1. arr.filter(i => i < 0)查找帶有負數的塊
  2. arr.filter(i => i === 0)查找零
  3. arr.filter(i => i > 0)查找帶有正數的塊
  4. concat它們全部組合成一個陣列。

我是Neo。

 'use strict'; let myInput = '3,-2,1,0,-1,0,-2,1'; let myNumbers = myInput.split(',').map(Number); let negatives = []; let zeroes = []; let positives = []; for (const element of myNumbers) { if (element < 0) { negatives.push(element); } else if (element === 0) { zeroes.push(element); } else if (element > 0) { positives.push(element); } } let sortedArr = negatives.concat(zeroes, positives); console.log(sortedArr.join(',')); 

邏輯還是錯別字?

“ ...對所有小於零的整數升序,對大於零的整數則相反...”

按照所發布的內容,示例應為:

-2, -2, -1, 0, 0, 3, 1, 1-12, -2, 0, 0, 0, 13, 5, 3, 1

零且遞增程度較小: -3, -2, -1, 0 :大於零下降大於3, 2, 1

要獲得這些結果,請參見演示1


嚴格按照示例進行操作比較簡單:

-2, -1, -2, 0, 0, 3, 1, 1-12, -2, 0, 0, 0, 3, 13, 5, 1

分組負數,然后是零,然后是正數: [-][0][+] 三個陣列中不需要順序。 這三個組僅需訂購。

要獲得這些結果,請參見演示2


說明

演示1

  1. 首先,按升序對數組進行排序:

    constordered = array .sort ((當前,下一個)=>當前-下一個);

  2. 接下來,找到第一個大於0的數字的索引,然后提取所有從該索引開始到最后一個數字結束的數字。 將提取的數組存儲在變量中:

    const positive =有序.splice (有序.findIndex (數字=>數字> 0));

  3. 最后,按降序對提取的數組進行排序,然后將提取的數組連接到原始數組的末尾:

    返回有序的.concat (positive.sort((current,next)=> next-current));

演示2

  1. 創建由filter()方法返回的三個新數組:負數( n < 0 ),零( n === 0)和正數( n > 0 )。

  2. 然后將它們串聯成一個數組:

    const negative = array.filter(number => number <0);

    const 0 = array.filter(number => number === 0);

    const positive = array.filter(number => number> 0);

    返回negative.concat(零,正);


演示1

 const unorderedA = [3, -2, 1, 0, -1, 0, -2, 1]; const unorderedB = [3, -12, 0, 0, 13, 5, 1, 0, -2]; const illogical = array => { const ordered = array.sort((current, next) => current - next); const positive = ordered.splice(ordered.findIndex(number => number > 0)); return ordered.concat(positive.sort((current, next) => next - current)); }; // For demonstration purposes const log = data => { const string = Array.isArray(data) ? `[${data.join(', ')}]` : data; return console.log(string); }; log(illogical(unorderedA)); log(illogical(unorderedB)); 

演示2

 const unorderedA = [3, -2, 1, 0, -1, 0, -2, 1]; const unorderedB = [3, -12, 0, 0, 13, 5, 1, 0, -2]; const illogical = array => { const negative = array.filter(number => number < 0); const zero = array.filter(number => number === 0); const positive = array.filter(number => number > 0); return negative.concat(zero, positive); }; // For demonstration purposes const log = data => { const string = Array.isArray(data) ? `[${data.join(', ')}]` : data; return console.log(string); }; log(illogical(unorderedA)); log(illogical(unorderedB)); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM