Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++
C++
  1. Meeting Scheduler ใน C++: หาช่วงเวลาว่างร่วมที่เร็วที่สุด

    โจทย์ กำหนดช่วงเวลาว่างของคน 2 คน (slots1, slots2) และระยะเวลาประชุม duration หาช่วงเวลาที่ทั้งคู่ว่างร่วมกันและยาวพอ ไปที่เร็วที่สุด รูปแบบช่วง: [start, end] (inclusive) ไม่มีช่วงทับซ้อนในคนเดียวกัน ตัวอย่าง: slots1=[[10,50],[60,120],[140,210]], slots2=[[0,15],[60,70]], duration=8 → [60,68] แนวคิด

  2. Toss Strange Coins ใน C++: ความน่าจะเป็นจำนวนหัวเท่ากับ Target

    โจทย์ มีเหรียญ n อัน เหรียญที่ i มีโอกาส prob[i] ที่จะออกหัว หาโอกาสที่จำนวนหัวเท่ากับ target ทุกอย่างเมื่อทอยครบ 1 รอบ ตัวอย่าง: prob = [0.5,0.5,0.5,0.5,0.5], target = 0 → 0.03125 (0.5^5) แนวคิด: Dynamic Programming dp[i][j] = โอกาสที่ทอยเหรียญแรก i+1 อัน ได้หัว j ครั้ง สัญลักษณ์: dp[i][j] = (1-pr

  3. Remove Sub-Folders from the Filesystem ใน C++: ลบโฟลเดอร์ย่อย

    โจทย์ กำหนดรายการพาธโฟลเดอร์ ลบโฟลเดอร์ย่อยทั้งหมด (โฟลเดอร์ที่อยู่ภายในอีกโฟลเดอร์หนึ่ง) คืนโฟลเดอร์ที่เหลือ ตัวอย่าง: [/myfolder,/myfolder/secondfolder,/another/document,/another/document/extrafolder,/another/final] → [/myfolder,/another/final,/another/document] แนวคิด: เรียงตามความยาว + Hash Set

  4. Range Sum Query 2D Immutable ใน C++: หาผลรวมในสี่เหลี่ยม 2D

    โจทย์ กำหนดเมทริกซ์ 2D ตอบคำถาม: หาผลรวมในสี่เหลี่ยมที่กำหนดโดยมุมซ้ายบน (row1, col1) และมุมขวาล่าง (row2, col2) เมทริกซ์ไม่เปลี่ยนแปลง (Immutable) แนวคิด: 2D Prefix Sum (Integral Image) สร้างเมทริกซ์ dp ขนาดเท่าเดิม โดย dp[i][j] = ผลรวมจาก (0,0) ถึง (i,j) แล้วคำตอบ = dp[row2][col2] - dp[row1-1][co

  5. Lexicographical Numbers ใน C++: เรียงตัวเลข 1 ถึง n แบบ Dictionary Order

    โจทย์ กำหนดจำนวนเต็ม n คืนอาร์เรย์ตัวเลข 1 ถึง n เรียงตามลำดับเลขศัพท์ (Lexicographical Order) ตัวอย่าง: n = 13 → [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9] แนวคิด: DFS / Pre-order Traversal บนต้นไม้ 10 แยก จินตนาการต้นไม้ที่รากคือ 1-9 แต่ละโหนดมีลูก 10 ตัว (เพิ่มหลักท้าย 0-9) การเดิน Pre-order จะ

  6. Repeated DNA Sequences ใน C++: หาลำดับ DNA ยาว 10 ตัวอักษรที่ซ้ำ

    โจทย์ กำหนดสตริง DNA ประกอบด้วย A, C, G, T หาลำดับย่อยยาว 10 ตัวอักษรที่เกิดขึ้นมากกว่า 1 ครั้ง ตัวอย่าง: AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT → [AAAAACCCCC, CCCCCAAAAA] แนวคิด: Rolling Hash + Bitmask เข้ารหัส 4 ตัวอักษรเป็น 2 บิต: A=00, C=01, G=10, T=11 ลำดับ 10 ตัว = 20 บิต → ใช้ integer 32-bit เก็บไ

  7. Bitwise AND of Numbers Range ใน C++: หา AND ของช่วงตัวเลข

    โจทย์ กำหนดช่วง [m, n] โดยที่ 0 ≤ m ≤ n ≤ 2,147,483,647 หาค่า Bitwise AND ของทุกตัวเลขในช่วงนี้รวมปลายทาง ตัวอย่าง: [5, 7] → 5 & 6 & 7 = 4 แนวคิด: หาบิตร่วมทั่วไป (Common Prefix) Bitwise AND ของช่วงจะเก็บเฉพาะบิตที่เหมือนกันทั้งหมดตั้งแต่ MSB จนกว่าจะเจอบิตที่ต่างกัน บิตที่ต่างกันและบิตต่ำก

  8. Contains Duplicate III ใน C++: หาคู่ค่าที่ใกล้เคียงกันภายในช่วงดัชนีและค่า

    โจทย์ กำหนดอาร์เรย์จำนวนเต็ม ตรวจสอบว่ามีดัชนี i และ j ที่ต่างกันทำให้: |nums[i] - nums[j]| <= t (ความต่างค่าสัมบูรณ์ ≤ t) |i - j| <= k (ความต่างดัชนีสัมบูรณ์ ≤ k) ตัวอย่าง: nums = [1,2,3,1], k = 3, t = 0 → คืน true เพราะ nums[0] และ nums[3] เท่ากันและห่างกัน 3 ดัชนี แนวคิด: Sliding Win

  9. Rectangle Area ใน C++: คำนวณพื้นที่รวมของสี่เหลี่ยมสองรูป

    โจทย์ หาพื้นที่รวมที่ถูกครอบคลุมโดยสี่เหลี่ยมสองรูปในระนาบ 2D โดยแต่ละรูปกำหนดโดยมุมซ้ายล่าง (A,B) และมุมขวาบน (C,D) สำหรับรูปแรก และ (E,F) (G,H) สำหรับรูปที่สอง แนวคิดการแก้ปัญหา พื้นที่รวม = พื้นที่รูปแรก + พื้นที่รูปที่สอง - พื้นที่ทับซ้อน (ถ้ามี) ขั้นตอน ตรวจสอบว่าไม่ทับซ้อนกัน: ถ้า C <=

  10. Majority Element II ใน C++: หาองค์ประกอบที่ปรากฏมากกว่า n/3 ครั้ง

    โจทย์ กำหนดอาร์เรย์จำนวนเต็ม ให้หาองค์ประกอบที่ปรากฏมากกว่า floor(n/3) ครั้ง โดยที่ n คือขนาดของอาร์เรย์ ตัวอย่าง: หากอินพุตคือ [1,1,1,3,3,2,2,2] ผลลัพธ์จะเป็น [1,2] แนวคิดการแก้ปัญหา (Boyer-Moore Voting Algorithm ขยายรูปแบบ) เนื่องจากองค์ประกอบที่ปรากฏมากกว่า n/3 ครั้ง สูงสุดมีได้ 2 ตัว เราสามารถใ

  11. วิธีการวางวงเล็บต่างกันใน C++

    ให้สตริงประกอบด้วยตัวเลขและตัวดำเนินการ +, -, * หาผลลัพธ์ทั้งหมดที่เป็นไปได้จากการวางวงเล็บต่างกัน (Different Ways to Add Parentheses) ตัวอย่าง: 2*3-4*5 → [-34, -14, -10, -10, 10] ขั้นตอนการแก้ปัญหา (Divide & Conquer + Memoization) Memoization map memo[string] → vector ฟังก์ชัน solve(input): ถ้าใน

  12. Single Number III ใน C++

    ให้อาร์เรย์มีตัวเลขทุกตัวปรากฏ 2 ครั้ง ยกเว้น 2 ตัวที่ปรากฏ 1 ครั้ง หาทั้งสองตัวนั้น ตัวอย่าง: [1,2,3,1,5,2] → [3,5] ขั้นตอนการแก้ปัญหา (XOR + Bit Partition) XOR ทั้งอาร์เรย์ → xor_all = a ^ b (a,b คือตัวที่ไม่ซ้ำ) หาบิตที่ต่างกัน (LSB ที่เป็น 1): pos = __builtin_ctz(xor_all) หรือวนลูปหา แบ่งอาร์เร

  13. Ugly Number II ใน C++

    หา Ugly Number ตัวที่ n: จำนวนที่เฉพาะตัวประกอบมีแค่ 2, 3, 5 (1 ถือว่าเป็น ugly number) ตัวอย่าง: 10th ugly number = 12 (ลำดับ: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12) ขั้นตอนการแก้ปัญหา (DP 3 Pointers) dp[1] = 1, สร้าง dp[n+1] สาม pointer: i2, i3, i5 เริ่มที่ 1 (ชี้ dp[1]) ค่าถัดไป: next2 = dp[i2]*2, next

  14. H-Index ใน C++

    ให้อาร์เรย์ citations (ไม่ได้เรียง) หา h-index: h = จำนวนสูงสุดที่มีอย่างน้อย h บทความถูกอ้างอิง ≥ h ครั้ง ตัวอย่าง: [3,0,6,1,7] → 3 (มี 3 บทความ ≥ 3: 3,6,7) ขั้นตอนการแก้ปัญหา (Counting Sort / Bucket) n = citations.size(), สร้าง bucket[n+1] นับความถี่: = n → bucket[n]++, มิฉะนั้น bucket[citation]+

  15. H-Index II ใน C++

    ให้อาร์เรย์ citations เรียงจากน้อยไปมาก (non-decreasing) หา h-index: h = จำนวนสูงสุดที่มีอย่างน้อย h บทความถูกอ้างอิง ≥ h ครั้ง ตัวอย่าง: [0,1,4,5,6] → 3 (มี 3 บทความ ≥ 3: 4,5,6) ขั้นตอนการแก้ปัญหา (Binary Search) low = 0, high = n-1 Binary search: mid = low + (high-low)/2 ถ้า

  16. ตัวเลขบวกกันได้ (Additive Number) ใน C++

    ให้สตริงตัวเลข ตรวจสอบว่าเป็น Additive Number หรือไม่ คือ สามารถแบ่งเป็นลำดับอย่างน้อย 3 ตัวที่ตัวหลัง = ผลรวมสองตัวก่อนหน้า (เช่น ฟิบอนัชชี) ตัวอย่าง: 112358 → true (1,1,2,3,5,8 : 2=1+1, 3=1+2, 5=2+3, 8=3+5) ขั้นตอนการแก้ปัญหา (Backtracking) ลองทุกความเป็นไปได้ของสองตัวแรก: i = ความยาวรวมของสองตั

  17. ผลคูณความยาวคำสูงสุดที่ไม่มีตัวอักษรร่วมใน C++

    ให้อาร์เรย์สตริง words หา max(len(word[i]) * len(word[j])) โดยที่ word[i] และ word[j] ไม่มีตัวอักษรร่วมกัน (lowercase เท่านั้น) หาไม่ได้คืน 0 ตัวอย่าง: [abcw,baz,foo,bar,xtfn,abcdef] → 16 (abcw และ xtfn) ขั้นตอนการแก้ปัญหา (Bitmask) แปลงแต่ละคำเป็น bitmask 26 บิต: บิต k = 1 ถ้ามีตัวอักษร a+k เก็บ m

  18. สร้างเส้นทางการบินใหม่ใน C++

    ให้รายการตั๋วเครื่องบิน [from, to] ทั้งหมดเป็นของคนเดียวกัน เริ่มจาก JFK ต้องสร้างเส้นทาง (itinerary) ใช้ตั๋วทุกใบพอดี 1 ใบ หากมีหลายทาง ให้เลือกทางที่ lexical order น้อยที่สุด ตัวอย่าง: [[MUC,LHR],[JFK,MUC],[SFO,SJC],[LHR,SFO]] → [JFK,MUC,LHR,SFO,SJC] ขั้นตอนการแก้ปัญหา (Hierholzers Algorithm / Eul

  19. การแยกจำนวนเต็มเพื่อหาผลคูณสูงสุดใน C++

    ให้จำนวนเต็มบวก n แยกเป็นผลรวมของจำนวนเต็มบวกอย่างน้อย 2 จำนวน เพื่อให้ ผลคูณสูงสุด ตัวอย่าง: n=10 → 36 (10 = 3+3+4, 3×3×4=36) ขั้นตอนการแก้ปัญหา (DP / Mathematical) วิธี DP (Top-down with memo): ฟังก์ชัน solve(n, dp, flag): flag = true หมายถึงการเรียกครั้งแรก (ต้องแยกอย่างน้อย 2 จำนวน) ถ้า n == 0

  20. นับจำนวนที่มีตัวเลขไม่ซ้ำใน C++

    ให้จำนวนเต็มไม่ติดลบ n นับจำนวน x ในช่วง [0, 10^n) ที่ตัวเลขทุกหลักไม่ซ้ำกัน ตัวอย่าง: n=2 → 91 (0-99 ยกเว้น 11,22,33,44,55,66,77,88,99) ขั้นตอนการแก้ปัญหา (Combinatorics) ถ้า n == 0 → 1 (แค่ 0) n = min(n, 10) (มากกว่า 10 หลักไม่มีตัวเลขไม่ซ้ำได้) ถ้า n == 1 → 10 (0-9) ans = 9 (หลักแรก 1-9), ret =

Total 6007 -คอมพิวเตอร์  FirstPage PreviousPage NextPage LastPage CurrentPage:166/301  20-คอมพิวเตอร์/Page Goto:1 160 161 162 163 164 165 166 167 168 169 170 171 172