Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ตรวจสอบเบอร์โทรศัพท์ fancy ใน C++

Fancy Phone Number คืออะไร?

เบอร์โทร 10 หลัก ที่ตรงตามเงื่อนไขอย่างน้อย 1 ข้อจาก 3 ข้อ:

  1. 3 ตัวเลขติดกันเหมือนกัน เช่น 555, 7777
  2. 3 ตัวเลขติดกันเรียงลำดับ เพิ่มหรือลด เช่น 123, 456, 321, 987
  3. ตัวเลขใดตัวเลขหนึ่งปรากฏ 4 ครั้งขึ้นไป ในเบอร์ทั้งหมด เช่น 8965499259 (มี 9 อยู่ 4 ครั้ง)

ตัวอย่าง

9859009976 → มี 9 อยู่ 4 ครั้ง (ตำแหน่ง 1, 3, 7, 8) → Fancy ✓

อัลกอริทึม

  1. รับ input เป็น string (10 ตัวอักษร)
  2. ตรวจสอบเงื่อนไข 1: วน i=0..7 ถ้า s[i]==s[i+1]==s[i+2] → true
  3. ตรวจสอบเงื่อนไข 2: วน i=0..7 ถ้า s[i],s[i+1],s[i+2] เพิ่ม/ลดทีละ 1 → true
  4. ตรวจสอบเงื่อนไข 3: นับ frequency แต่ละตัวเลข ถ้ามี ≥ 4 → true
  5. รวมผลด้วย OR

ตัวอย่างโค้ด C++

#include <iostream>
#include <string>
#include <array>
using namespace std;

bool hasThreeConsecutiveSame(const string& s) {
    for (int i = 0; i + 2 < s.size(); i++) {
        if (s[i] == s[i+1] && s[i+1] == s[i+2])
            return true;
    }
    return false;
}

bool hasThreeConsecutiveSeq(const string& s) {
    for (int i = 0; i + 2 < s.size(); i++) {
        int a = s[i] - '0', b = s[i+1] - '0', c = s[i+2] - '0';
        if ((a + 1 == b && b + 1 == c) || (a - 1 == b && b - 1 == c))
            return true;
    }
    return false;
}

bool hasDigitFourTimes(const string& s) {
    array freq = {0};
    for (char c : s) freq[c - '0']++;
    for (int f : freq) if (f >= 4) return true;
    return false;
}

bool isFancyNumber(const string& s) {
    return hasThreeConsecutiveSame(s) 
        || hasThreeConsecutiveSeq(s) 
        || hasDigitFourTimes(s);
}

int main() {
    string numbers[] = {
        "7609438921",  // มี 9 4 ครั้ง? นับดู: 7,6,0,9,4,3,8,9,2,1 → 9 แค่ 2 ครั้ง
        "9859009976",  // 9: pos 0,2,6,7 = 4 ครั้ง ✓
        "1234567890",  // 123, 234, ... ✓
        "1112223333",  // 111, 222, 333, 3×4 ✓
        "1212121212"   // ไม่มี 3 ติด, ไม่มี 4 ครั้ง
    };
    
    for (const string& num : numbers) {
        cout << num << ": " << (isFancyNumber(num) ? "FANCY" : "Not fancy") << endl;
    }
    return 0;
}

ผลลัพธ์

7609438921: Not fancy
9859009976: FANCY
1234567890: FANCY
1112223333: FANCY
1212121212: Not fancy

หมายเหตุ

ตัวอย่างในโจทย์เดิม "7609438921" บอกว่าเป็น Fancy แต่จากการนับ 9 มีแค่ 2 ครั้ง (ตำแหน่ง 3 และ 7) อาจมี typo ในตัวอย่างต้นฉบับ โค้ดข้างต้นตรวจสอบอย่างถูกต้องตามเงื่อนไข 3 ข้อ