LmaoSuVuong
Senior Member
mới pvan hôm qua nay đi làm luôn r à, nhanh quá vNay chắc ko có thời gian leetcode rồi, học job mới ngập mặt
Hẹn thím tháng sau![]()
mới pvan hôm qua nay đi làm luôn r à, nhanh quá vNay chắc ko có thời gian leetcode rồi, học job mới ngập mặt
Hẹn thím tháng sau![]()
medium mà rating 2k1 ảo lòiCơm thêm 1 bài đồ thị cho @Cố Trường Ca test kĩ năng, rating gần 2k1 tạm ổn ko quá khó
class Solution {
func canArrange(_ arr: [Int], _ k: Int) -> Bool {
guard k > 1 else { return true }
let arr = arr.map{
var num = $0%k
if num < 0 {
num += k
}
return num
}
var dict:[Int:Int] = [:]
for num in arr {
dict[num, default:0] += 1
}
var half = k/2
if 2*half == k {
if let count = dict[half], count%2 == 1 {
return false
}
half -= 1
}
if let count = dict[0], count%2 == 1 {
return false
}
guard k > 2 else { return true }
for num in 1...half {
if dict[num, default:0] != dict[k-num, default:0] {
return false
}
}
return true
}
}
Đọc chữ ký đi fenmới pvan hôm qua nay đi làm luôn r à, nhanh quá v![]()
Q3 contest vừa rồi Medium 300 thằng giải được đómedium mà rating 2k1 ảo lòi

class Solution {
public boolean canArrange(int[] arr, int k) {
Map<Integer, Integer> remain = new HashMap<>();
for (int num : arr) {
int rem = ((num % k) + k) % k;
int count = remain.getOrDefault(rem, 0);
remain.put(rem, count + 1);
}
for (int num : arr) {
int r = ((num % k) + k) % k;
if (r == 0) {
if (remain.get(r) % 2 != 0) return false;
}
else if (!remain.get(r).equals(remain.get(k - r))) return false;
}
return true;
}
}
ông larry giải từ từ chậm chậm mà chắc phết nhỉ, bài sliding window tuần trước cũng giải hết 40p, thua cả vozer nhưng mà contest nào cũng 4/4Q3 contest vừa rồi Medium 300 thằng giải được đó![]()
Cơ bản là mấy ông biết mình có trình độ nên bình tĩnh giải, bình tĩnh debug vl, biết cách tối ưu nữa. Mà 4/4 mấy ông 2k7 2k8 đổ lên phải vô top 100 200 chứ tụt rank smlông larry giải từ từ chậm chậm mà chắc phết nhỉ, bài sliding window tuần trước cũng giải hết 40p, thua cả vozer nhưng mà contest nào cũng 4/4![]()
Như mình Vozlit loanh quanh 2k cứ giải 3Q là đủ quota rồiCơ bản là mấy ông biết mình có trình độ nên bình tĩnh giải, bình tĩnh debug vl, biết cách tối ưu nữa. Mà 4/4 mấy ông 2k7 2k8 đổ lên phải vô top 100 200 chứ tụt rank sml
via theNEXTvoz for iPhone
. Tuần nào giải được 4Q thì vui còn không đến Q4 bí quá tắt máy đi chơi. Cá biệt có vài tuần Q3 cũng không đớp được 
Cám ơn bác nhaNếu mục tiêu chỉ để phỏng vấn thì có thể follow theo roadmap của những ng đã từng thành công, trong thớt này cũng có nhiều bạn chia sẻ rồi.
Roadmap mình đề xuất:
1. (1-2 ngày) Big O notation: Cái này là cực kì quan trọng khi làm LC. Phải nắm rõ và có thói quen est đc độ phức tạp của mọi thứ mình làm trong 1 nốt nhạc. Kĩ năng này cần phải luyện tập nhiều nhưng cần dành thời gian tập luyện trước cho vững rồi củng cố dần dần.
2. (14-21 ngày) Cấu trúc dữ liệu căn bản: Học 1 lượt về các cấu trúc dữ liệu căn bản, các thao tác trên CTDL đó và độ phức tạp tương ứng. Hiểu được CTDL nào thì nên dùng lúc nào với bài toán nào. Mục tiêu là làm đc 3-4 bài level super easy cho mỗi CTDL. Có thể sử dụng LC Study Plan cho phần này (https://leetcode.com/study-plan/data-structure/). CTDL căn bản gồm:
- Mảng
- Hashtable / Hash Map / Hash Set
- Stack / queue
- Linked list
- Tree các thể loại
- Graph các thể loại
3. (7 - 14 ngày) Thuật toán căn bản: Học các thuật toán cơ bản thường dùng, và tập phân tích độ phức tạp của mỗi chi phí. Tương tự, mục tiêu là hoàn thành đc 3-4 bài mỗi topic mức độ easy. Bao gồm:
- Tìm kiếm nhị phân
- Tìm kiếm tuyến tính
- Sort: (Quick, merge, heap, count, radix)
- Prefix sum
- Đệ quy
- DFS / BFS
4. (14 - 21 ngày) Đào sâu vào các CTDL nâng cao theo chuyên đề. Vẫn là CTDL nhưng làm các bài medium (5-6 bài mỗi topic) và học thêm các CTDL nâng cao hơn như Trie, Segment Tree,...
5. (21 - 30 ngày) Tương tự nhưng đào sâu vào các thuật toán nâng cao, mỗi topic làm đc 4-5 bài medium. Giai đoạn này mới thực sự là bắt đầu grinding:
- Sliding window
- Two pointers
- Backtracking
- Monotonic stack / queue
- Math & Bitwise
- Geometry
- Graph algorithms
- Dynamic programming
6. (7 - 14 ngày) Làm ngẫu nhiên. Qua bước 5 thì thím đã khá vững vàng để chiến đấu rồi, bước tiếp theo là làm ngẫu nhiên các bài level medium (hoặc hard luôn) mà không biết trước chủ đề để tập vận dụng các kiến thức linh hoạt. Mỗi ngày làm 1-3 bài liên tục tầm 1-2 tuần là đc.
7. (Vô chừng) FAANG: Hết bước 6 chỉ cho các bác vào đc cái cty top tier ở VN thôi, để vào FAANG mình nghĩ là cần phải done được các bài hard trong khoản thời gian dưới 45p. Nó khó vkl và mình cũng k chắc là làm được nên k biết chỉ sao.
Cuối cùng, đừng dành hết thời gian vào để cày LC nếu chỉ vì muốn pass phỏng vấn, vì:
p/s: Mình vẫn ở VN, trước mắt cũng k có ý định relocate sang nc ngoài làm việc. Mình làm LC vì sở thích chứ cũng k có mục tiêu vào cty nào.
- Phỏng vấn còn rất nhiều phần khác, LC chỉ là cánh cửa đầu tiên. Nếu nói ra nó chiếm đc khoảng 30% kết quả phỏng vấn của các bác thôi.
- Dù là thuật toán, thì cái code / solution cũng chỉ chiếm được 40% trong cái 30% đó thôi, 60% còn lại là:
- Cách phát triển vấn đề, tư duy để tìm ra giải pháp
- Cách code, có gọn gàng sạch đẹp không, có suy nghĩ đc các edge case k, gặp vấn đề cách debug như thế nào
- Cách trình bày: Phải giải thích được code & ý tưởng của mình cho interviewer hiểu. Nếu không tất cả cũng vô nghĩa
- Cuối cùng, LC chả giúp gì nhiều trong công việc thực tế, nếu sau khi pass pv xong bạn fail probation thì cũng vậy cả.
class Solution:
def canArrange(self, arr: List[int], k: int) -> bool:
d = defaultdict(int)
for a in arr:
mod = a % k
remain = k - mod if mod != 0 else 0
if remain in d and d[remain] > 0:
d[remain] -= 1
else:
d[mod] += 1
for v in d.values():
if v > 0:
return False
return True
class Solution:
def canArrange(self, arr: List[int], k: int) -> bool:
return (sum(arr) % k == 0) and min(arr) < k/2 and max(arr) > k/2
Cũng thấy idea này trong các submission nhưng có vẻ sai rồi.Python:class Solution: def canArrange(self, arr: List[int], k: int) -> bool: return (sum(arr) % k == 0) and min(arr) < k/2 and max(arr) > k/2
Bài này test case sida vl luôn thímCũng thấy idea này trong các submission nhưng có vẻ sai rồi.
Test case arr = [10, 20, 30, 40], k = 5.

class Solution {
public boolean canArrange(int[] arr, int k) {
HashMap<Integer,Integer> map = new HashMap<>();
for(int n:arr){
int mod = (n%k+k)%k;
int mod2 = (k-mod)%k;
if(map.containsKey(mod2)){
int count = map.get(mod2);
if(count ==1)
map.remove(mod2);
else
map.put(mod2,count-1);
}else
map.put(mod,map.getOrDefault(mod,0)+1);
}
if(map.size()==0)
return true;
return false;
}
}


Có phần luyện interview ấy thím@freedom.9 Thím có thể cho e vài tips live coding không ạ. Em ít kinh nghiệm phần live code này, lần gần đây nhất live code thì e bị run và under perform. Cảm ơn thím
Edit: T5 này e live code![]()
Thanks thím, để e thửCó phần luyện interview ấy thímluyện quen rồi đỡ áp lực hơn, đã thử và thành công![]()

đã là ngôi sao thì ở đâu cũng là sân khấumới pvan hôm qua nay đi làm luôn r à, nhanh quá v![]()

/**
* @param {number[]} arr
* @param {number} k
* @return {boolean}
*/
var canArrange = function (arr, k) {
const C = Array(k + 69).fill(0);
let c = 0;
for (const n of arr) {
const u = (n % k + k) % k, v = k - u;
if (!u || u === v) {
c += (C[u] ^= 1) ? 1 : -1;
continue;
}
if (C[v] > C[u]) {
C[v]--;
c--;
} else {
C[u]++;
c++;
}
}
return !c;
};
Bớt dùm đơn 1 hònđã là ngôi sao thì ở đâu cũng là sân khấu![]()