บทนำ
โปรแกรมนี้จะทำสองอย่าง: (1) คูณ 2 กับตัวเลขที่อยู่ติดกันและมีค่าเท่ากัน (2) เลื่อนค่า 0 ทั้งหมดไปอยู่ท้ายอาร์เรย์
ขั้นตอนการแก้ปัญหา
- วนลูปตรวจสอบค่าที่ติดกันและเท่ากัน (และไม่ใช่ 0)
- ถ้าเจอ ให้คูณ 2 กับตัวแรก และตั้งตัวที่สองเป็น 0
- ข้ามตัวถัดไป (เพราะกลายเป็น 0 แล้ว)
- หลังจบลูป ให้เลื่อน 0 ทั้งหมดไปท้ายอาร์เรย์
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
void moveZeroesToEnd(int arr[], int n) {
int count = 0;
for (int i = 0; i < n; i++) {
if (arr[i] != 0) {
arr[count++] = arr[i];
}
}
while (count < n) {
arr[count++] = 0;
}
}
void updateAndRearrangeArray(int arr[], int n) {
if (n == 1) {
return;
}
for (int i = 0; i < n - 1; i++) {
if ((arr[i] != 0) && (arr[i] == arr[i + 1])) {
arr[i] = 2 * arr[i];
arr[i + 1] = 0;
i++;
}
}
moveZeroesToEnd(arr, n);
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
}
int main() {
int arr[] = { 2, 3, 3, 4, 0, 5, 5, 0 }, n = 7;
cout << "Given Array: ";
printArray(arr, n);
cout << endl;
updateAndRearrangeArray(arr, n);
cout << "Updated Array: ";
printArray(arr, n);
cout << endl;
return 0;
}
ผลลัพธ์
Given Array: 2 3 3 4 0 5 5 Updated Array: 2 6 4 10 0 0 0
คำอธิบายผลลัพธ์
- 3, 3 ติดกัน → คูณ 2 ได้ 6, ตัวที่สองกลายเป็น 0
- 5, 5 ติดกัน → คูณ 2 ได้ 10, ตัวที่สองกลายเป็น 0
- 0 ทั้งหมดถูกเลื่อนไปท้าย
สรุป
อัลกอริทึมนี้คล้ายกลไกของเกม 2048 แบบง่ายๆ เหมาะสำหรับฝึกฝนการจัดการอาร์เรย์และ pointer