Chúng tôi được yêu cầu viết một hàm JavaScript nhận mảng hai chiều (nhất thiết là ma trận vuông) gồm các mảng các ký tự như thế này -
const arr = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ];
Hàm phải tạo một mảng mới lấy các phần tử từ mảng đầu vào bắt đầu từ vị trí (0, 0) và trả về mảng một chiều đó.
Do đó, đối với mảng này, hình xoắn ốc sẽ giống như -
const output = [1, 2, 3, 6, 9, 8, 7, 4, 5];
Chúng tôi sẽ tạo một biến tạm thời trỏ đến hàng hiện tại và cột hiện tại, cả ở đầu và cuối.
Bằng cách đó, chúng ta có thể lặp đi lặp lại việc tăng hàng bắt đầu và cột bắt đầu và giảm hàng kết thúc và cột kết thúc theo cách xoắn ốc về phía trung tâm của ma trận.
Ví dụ
const arr = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]; const spiral = (arr = []) => { if (!arr || arr.length === 0) { return []; }; let startRow = 0; let startCol = 0; let res = []; let endCol = arr[0].length - 1; let endRow = arr.length - 1; while (startRow <= endRow && startCol <= endCol) { for (let i = startCol; i <= endCol; i++) { res.push(arr[startRow][i]); } startRow++; for (let i = startRow; i <= endRow; i++) { res.push(arr[i][endCol]); } endCol--; if (startRow <= endRow) { for (let i = endCol; i >= startCol; i--) { res.push(arr[endRow][i]); } endRow--; } if (startCol <= endCol) { for (let i = endRow; i >= startRow; i--) { res.push(arr[i][startCol]); } startCol++; } } return res; }; console.log(spiral(arr));
Đầu ra
Và đầu ra trong bảng điều khiển sẽ là -
[ 1, 2, 3, 6, 9, 8, 7, 4, 5 ]