Yêu cầu: đảo ngược mảng nhưng không thay đổi chỉ số của ký tự đặc biệt (ví dụ '#'). Mảng [18,-4,'#',0,8,'#',5] => [5, 8, "#", 0, -4, "#", 18]. Số đảo ngược, '#' giữ nguyên chỉ số.
Dùng hai con trỏ (two-pointer): start và end trỏ hai đầu. Nếu gặp ký tự đặc biệt thì bỏ qua (tăng/giảm con trỏ), nếu cả hai không phải ký tự đặc biệt thì hoán đổi giá trị.
Ví dụ
const arr = [18,-4,'#',0,8,'#',5];
const reverseArray = (arr, special) => {
let start = 0, end = arr.length - 1, temp;
while (start < end) {
if (arr[start] === special) {
start++;
continue;
}
if (arr[end] === special) {
end--;
continue;
}
temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
};
reverseArray(arr, '#');
console.log(arr);Kết quả
Đầu ra trong console sẽ là:
[ 5, 8, '#', 0, -4, '#', 18 ]