Vấn đề
Cần viết hàm JS nhận hai số m (dạng chuỗi) và n. Xóa n chữ số từ m để số còn lại nhỏ nhất. Trả về số sau khi xóa.
Ví dụ:
const m = '45456757'; const n = 3;
Kết quả:
const output = '44557';
Giải thích:
Xóa 5, 6, 7 để được số nhỏ nhất.
Ví dụ
Mã thực hiện:
const m = '45456757'; const n = 3; const removeDigits = (m, n, stack = []) => { let arr = m.split('').map(Number); for(let el of arr){ while (n && stack.length && el < stack[stack.length - 1]){ stack.pop(); --n; }; stack.push(el); }; let begin = stack.findIndex(el => el > 0); let end = stack.length - n; return (!stack.length || begin == -1 || begin == end) ? "0" : stack.slice(begin, end).join('').toString(); }; console.log(removeDigits(m, n));
Giải thích code:
Thuật toán tham lam dùng stack: duyệt trái sang phải, đẩy vào stack sau khi pop các phần tử lớn hơn (miễn còn quota xóa). Vị trí trái quan trọng hơn nên ưu tiên chữ số nhỏ ở trái. Cuối cùng nếu còn quota xóa, xóa từ phải.
Kết quả
Kết quả in ra console:
44557