ตัวเลขที่ประกอบด้วยตัวเลขทั้งหมดจาก 0 ถึงฐาน B เรียกว่าเลขแพนดิจิตอล (Pandigital Number) ในฐานนั้น แต่บางตัวเลขมีตัวเลขจาก 1 ถึง 9 เรียกว่า Zero-less Pandigital Numbers ตัวอย่างของเลขแพนดิจิตอลคือ 0123456789, 0789564312 ฯลฯ
ในบทช่วยสอนนี้ เราจะอภิบัติปัญหาที่เราได้รับตัวเลขและฐาน และต้องตรวจสอบว่าตัวเลขนั้นเป็นแพนดิจิตอลในฐานที่กำหนดหรือไม่ เช่น
Input: num = "9651723467380AZ", base = 10 Output: YES Explanation: num มีตัวเลขครบทุกตัวในฐาน 10 คือ 0 ถึง 9 จึงเป็นแพนดิจิตอล Input: num = "130264ABCDE745789", base = 16 Output: NO Explanation: num ไม่มี F(15) ซึ่งอยู่ในฐาน 16 คือ 0 ถึง 15 จึงไม่ใช่แพนดิจิตอล
วิธีการแก้ปัญหา
เพื่อแก้ปัญหานี้ เราจะใช้ Set และแทรกตัวเลขแต่ละตัวลงใน Set เพราะเราต้องเก็บค่าที่ไม่ซ้ำกัน
- วนลูปผ่านสตริง รับตัวอักษรแต่ละตัวทีละตัว
- ตรวจสอบว่าสมาชิกเป็นตัวเลขหรือตัวอักษร
- ถ้าเป็นตัวอักษร ให้บวก 10 เข้ากับตำแหน่งในอัลฟาเบตเพื่อแทนค่าสองหลัก
- เก็บค่าใน Set
- หลังจบการวนลูป ตรวจสอบว่าขนาดของ Set เท่ากับฐานหรือไม่
ตัวอย่าง
โค้ด C++ สำหรับวิธีการข้างต้น
#include<bits/stdc++.h>
using namespace std;
int main(){
int base = 10;
char n[] = "9651723467380AZ";
set<int, greater<int> > s;
for (int i = 0; i < strlen(n); i++){
if (n[i] >= '0' && n[i] <= '9')
s.insert(n[i]- '0');
else if (n[i] - 'A' <= base - 11)
s.insert(n[i] - 'A' + 10);
}
if(s.size()==base) cout<< "YES";
else cout<< "NO";
return 0;
}
ผลลัพธ์
YES
สรุป
ในบทช่วยสอนนี้ เราอภิบัติปัญหาที่เราได้รับตัวเลขและฐาน ต้องตรวจสอบว่าตัวเลขเป็นแพนดิจิตอลหรือไม่ เราอภิบัติวิธีง่ายในการแก้ปัญหานี้โดยการแทรกค่าใน Set และตรวจสอบขนาดกับฐาน เรายังอภิบัติโปรแกรม C++ สำหรับปัญหานี้ ซึ่งสามารถทำได้กับภาษาอื่น เช่น C, Java, Python ฯลฯ หวังว่าจะเป็นประโยชน์