Mảng butterfly shuffle: số giảm dần đến giữa mảng rồi tăng dần đến cuối. Số lớn nhất ở đầu. Biến thể: số tăng đến giữa rồi giảm, số nhỏ nhất ở đầu.
Viết hàm nhận mảng số và chuỗi 'asc'/'des': 'des' => tăng đến giữa rồi giảm; 'asc' => giảm đến giữa rồi tăng.
Cách tiếp cận
- Sắp xếp mảng: 'asc' thì sort tăng, 'des' thì sort giảm.
- Chia mảng thành 2: phần tử chẵn push vào first, lẻ unshift vào second (hoặc ngược lại tùy độ dài chẵn/lẻ) để tự động đảo ngược một nửa.
- Nối hai mảng theo quy tắc.
Ví dụ
const array = [8,2,6,3,9,1,4,5,0,7];
const butterflyShuffle = (array, order = 'asc') => {
const arr = array.slice();
arr.sort((a, b) => order === 'asc' ? a - b : b - a);
const first = [], second = [];
const isEven = arr.length % 2 === 0;
for (let i = 0; i < arr.length; i++) {
if (i % 2 === 0) {
isEven ? first.push(arr[i]) : first.unshift(arr[i]);
continue;
}
isEven ? second.unshift(arr[i]) : second.push(arr[i]);
}
return isEven ? second.concat(first) : first.concat(second);
};
console.log(butterflyShuffle(array));
console.log(butterflyShuffle(array, 'des'));Kết quả
Đầu ra trong console sẽ là:
[
9, 7, 5, 3, 1,
0, 2, 4, 6, 8
]
[
0, 2, 4, 6, 8,
9, 7, 5, 3, 1
]