Cần giúp đỡ về hoán vị mảng con trong một Mảng


trên đây là minh họa về input output của bài toán và gợi ý code, Mong bác nào thông não cho em đoạn hàm Exchange cụ thể chi tiết với . Em cảm ơn

Mình nhìn vào còn hoang mang :smiley: mà cái này gọi là Rotate (xoay) :slight_smile:

Bài này có hai cách dễ làm là ba bước đảo mảng và nhảy cóc (khó hơn :smiley: ) đều O(n) :slight_smile: chứ ở trên là cách thứ ba.

3 Likes

cảm ơn bác, em đi học thì slide thầy giáo có gợi ý như vậy nhưng đọc xong vẫn chưa làm được . Bác có bài viết nào liên quan thì reply em với ạ

Cảm ơn về keyword của bác nhé, em tìm ra tài liệu để tham khảo rồi ạ, rất cảm ơn <3

Cách hơi chuối

  • Tạo hàm move() để “chuyển phần tử đầu tiên về cuối mảng

  • Để chuyển k phần tử đầu tiên về cuối mảng thì gọi k lần hàm move() là được

Để “chuyển phần tử đầu tiên về cuối mảng”

  • Lưu lại phần tử đầu tiên

  • Dời từng phần tử hiện tại lên vị trí trước nó arr[i] <= arr[i+1]

  • Gán phần từ cuối cùng = phần tử đầu tiên (được lưu ở trên).

Bỏ C++ lâu quá rồi nên bạn xem code java đỡ nhé

static void rotate(int arr[], int k) {
	// Chuyển k lần
	for (int i = 1; i <= k; i++) {
		move(arr);
	}
}

static void move(int arr[]) {
	int i, n, tmp;
	n = arr.length; // kích thước mảng
	tmp = arr[0];
	for (i = 0; i < n - 1; i++) {
		arr[i] = arr[i + 1];
	}
	arr[i] = tmp;
}

public static void main(String[] args) {
	int arr[] = { 1, 2, 3, 4, 5 };
	int k = 3; // chuyển k phần tử
	// [1, 2, 3, 4, 5]
	rotate(arr, k);
	// [4, 5, 1, 2, 3]
}
1 Like

Cái này là O(kn) :smiley: nhưng cách 2 cũng bắt đầu từ việc xoay đi 1 bước.

3 Likes

Bài này có 1 cách nữa O(n) nhưng bị tốn space thêm n nữa, trước mình làm do nó yêu cầu phải O(n) mới pass :’(

1 Like

Cách đó thì không tính tiền rồi :slight_smile:

Giờ mình mới biết có cách block swap.

3 Likes

cảm ơn các bác đã góp ý ạ.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?