01/10/2018, 16:18
Cho mình xin giải thuật bài này
Giả sử ta có 1 array: [1,2,3,4,5,6,7]
Viết function để “xoay” phần tử trong mạng, d là số lần xoay
d = 1 => [2,3,4,5,6,7,1]
d = 2 => [2,3,4,5,6,7,1] => [3,4,5,6,7,1,2]
d = 3 => [2,3,4,5,6,7,1] => [3,4,5,6,7,1,2] => [4,5,6,7,1,2,3]
Bài liên quan
Chạy vòng for từ 1 đến d, mỗi lần lặp thì đảo phần từ đầu xuống cuối là được mà
Bổ sung cho bạn
n là số phần tử trong mảng ban đầu
Có thể quay với O(1) mem (ừ) và O(n) time. 1 for.
bạn for từ 0 tới d, mỗi lần lặp như vậy thì append cái a[0] vào cuối array, và xoá a[0] đi.
như vậy ko cần phải để ý xem len của array là bao nhiêu, và d là bao nhiêu.
Cách giải của mình như sau:
Em chưa hiểu 2 chỗ:
1.1. Khi di chuyển
1
lần,a[0]
giờ nằm ởa[1]
1.2. Khi di chuyển
4
lần,a[0]
nằm ởa[4]
1.3. Khi di chuyển
n
lần,a[0]
đứng yên1.4. Khi di chuyển
n + 1
lần,a[0]
nằm ởa[1]
⇨ Khi di chuyển
d
lần,a[0]
nằm ởa[d % n]
1.5. Thứ tự của mảng là không đổi ⇨ Khi di chuyển
d
lần, mỗi phần tửa[i]
đều đi đến vị tría[i + d % n]
1.6. Nếu
i + d % n > n
thì lại phải% n
1 lần nữa1.7. (i + d % n) % n = (i + d) % n
Cách của bạn sẽ bị lỗi khi mà chữ số trong List có từ 2 chữ số trở lên. Mình thấy cách này tối ưu hơn.