สมมติว่ามีอาร์เรย์ A ขนาด n อมลปีนบันไดภายในอาคารหลายชั้น ทุกครั้งที่เริ่มปีนช่วงใหม่ จะนับตั้งแต่ 1 ใหม่ เช่น ถ้าปีน 2 ช่วง ช่วงแรก 3 ขั้น ช่วงที่สอง 4 ขั้น เขาจะพูดเลขว่า: 1, 2, 3, 1, 2, 3, 4 ในอาร์เรย์ A เลขเหล่านี้แสดงถึงหมายเลขขั้นที่อมลพูด เราต้องนับจำนวนช่วงบันไดที่เขาปีน และแสดงจำนวนขั้นในแต่ละช่วง
ตัวอย่าง
Input: A = [1, 2, 3, 1, 2, 3, 4, 5]
Output: 2, [3, 5] (2 ช่วงบันได จำนวนขั้นคือ 3 และ 5)
อัลกอริทึม
- นับจำนวนครั้งที่เจอเลข 1 ในอาร์เรย์ → ได้จำนวนช่วงบันได
- ทุกครั้งที่เจอเลข 1 (ยกเว้นครั้งแรก) ให้บันทึกค่าก่อนหน้า (คือจำนวนขั้นของช่วงก่อนหน้า)
- หลังจบลูป ให้บันทึกค่าสุดท้ายของอาร์เรย์ (จำนวนขั้นของช่วงสุดท้าย)
โค้ดตัวอย่าง (C++)
#include <bits/stdc++.h>
using namespace std;
void solve(vector<int> A) {
int i, p = 0;
int n = A.size();
// นับจำนวนช่วงบันได (จำนวนเลข 1)
for (i = 0; i < n; i++) {
if (A[i] == 1)
p++;
}
cout << p << endl;
// พิมพ์จำนวนขั้นของแต่ละช่วง
for (i = 1; i < n; i++) {
if (A[i] == 1)
cout << A[i - 1] << ", ";
}
cout << A[n - 1];
}
int main() {
vector<int> A = { 1, 2, 3, 1, 2, 3, 4, 5 };
solve(A);
}
ผลลัพธ์
2 3, 5