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

โปรแกรมหา Index ของค่าที่พบมากที่สุดใน Concealed Array (Python)

โจทย์

มีคลาส TestArray ที่มี Private Array (ค่า 0 หรือ 1 เท่านั้น) และ Public Methods สองตัว:

  • length() - คืนความยาวอาร์เรย์
  • query(p, q, r, s) - เปรียบเทียบค่าที่ดัชนี 4 ตัว คืนค่า:
    • 4: ทั้ง 4 ตัวเหมือนกัน (0 หรือ 1)
    • 2: 3 ตัวเหมือน 1 ตัวต่าง
    • 0: 2 ตัวเป็น 0 และ 2 ตัวเป็น 1

ต้องหา Index ของค่าที่พบมากที่สุด (0 หรือ 1) โดยใช้เฉพาะ Methods นี้ ถ้าเท่ากันคืน -1

อัลกอริธึม

  1. ใช้ query(0,1,2,3) และ query(0,1,2,4) เป็น Baseline
  2. จัดกลุ่ม Index เป็น Group A (ค่าเดียวกับ Baseline) และ Group B (ค่าต่าง)
  3. นับจำนวนในแต่ละกลุ่ม คืน Index ของกลุ่มที่มากกว่า

โค้ด Python

class TestArray:
    def __init__(self, array) -> None:
        self.__arr = array
    def length(self):
        return len(self.__arr)
    def query(self, p, q, r, s):
        val = self.__arr[p] + self.__arr[q] + self.__arr[r] + self.__arr[s]
        if val == 4 or val == 0:
            return 4
        elif val == 1 or val == 3:
            return 2
        elif val == 2:
            return 0

def solve(reader):
    n, groupA, groupB, aIdx, bIdx = reader.length(), 1, 0, None, None
    first, second = reader.query(0,1,2,3), reader.query(0,1,2,4)
    for i in range(4, n):
        if reader.query(0,1,2,i) == first:
            groupA, aIdx = groupA + 1, i
        else:
            groupB, bIdx = groupB + 1, i
    for i in range(3):
        nxt = [v for v in [0,1,2,3,4] if v != i]
        if reader.query(*nxt) == second:
            groupA, aIdx = groupA + 1, i
        else:
            groupB, bIdx = groupB + 1, i
    return aIdx if groupA > groupB else bIdx if groupB > groupA else -1

arr_ob = TestArray([0, 1, 1, 0, 1, 1, 1, 0])
print(solve(arr_ob))  # Output: 2

Input / Output

Input:  [0, 1, 1, 0, 1, 1, 1, 0]
Output: 2