Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++
C++
  1. หาค่าสูงสุดในอาร์เรย์โดยไม่ใช้ตัวดำเนินการเชิงสัมพันธ์ใน C++

    โจทย์ ได้รับอาร์เรย์ arr[] ขนาด n ที่ประกอบด้วยค่าบวก ทางเราต้อง หาค่าสูงสุดในอาร์เรย์โดยไม่ใช้ตัวดำเนินการเชิงสัมพันธ์ (Relational Operators) ตัวอย่าง Input: arr[] = {5, 1, 6, 7, 8, 2} Output: 8 แนวทางแก้ปัญหา เนื่องจากต้องเปรียบเทียบค่าโดยไม่ใช้ตัวดำเนินการตรรกะ เราจะใช้วิธี การลบซ้ำ (Repeated S

  2. พิมพ์เซลล์ที่มีผลรวมสี่เหลี่ยมผืนผ้าเท่ากันในเมทริกซ์ใน C++

    บทนำ โจทย์: หาเซลล์ (i,j) ในเมทริกซ์ ที่ผลรวมของ Submatrix (0,0) ถึง (i,j) + Submatrix (i,j) ถึง (m-1,n-1) เท่ากับผลรวมของเซลล์ที่เหลือทั้งหมด เงื่อนไข Sum(0,0 to i,j) + Sum(i,j to m-1,n-1) - mat[i][j] = TotalSum / 2 (ลบ mat[i][j] เพราะนับซ้ำ) ขั้นตอนการแก้ปัญหา สร้าง Aux1[i][j] = Prefix Sum จาก

  3. พิมพ์ BST Keys ในช่วงที่กำหนด ใช้พื้นที่ O(1) ด้วย Morris Traversal ใน C++

    บทนำ โจทย์: พิมพ์ Key ของ BST ที่อยู่ในช่วง [k1, k2] เรียงจากน้อยไปมาก ใช้พื้นที่ O(1) (ไม่ใช้ Stack/Queue/Recursion) Morris Traversal (Threaded Binary Tree) right == current → ลบ thread, visit current, ไปขวา ตัวอย่างโค้ด data = k1) cout data data = k1) cout dat

  4. พิมพ์วิธีแปลงสตริงหนึ่งเป็นอีกสตริงหนึ่ง (Edit Distance) ใน C++

    บทนำ โจทย์: หาวิธีแปลง str1 เป็น str2 ด้วยการ Insert, Remove, Replace พิมพ์ลำดับขั้นตอน (หนึ่งวิธีที่เป็นไปได้) แนวทางแก้ปัญหา สร้างตาราง DP[i][j] = minimum edits จาก str1[0..i-1] เป็น str2[0..j-1] DP[i][j] = DP[i-1][j-1] ถ้า str1[i-1]==str2[j-1] DP[i][j] = 1 + min(DP[i-1][j-1], DP[i-1][j], DP[i][

  5. Sum over Subsets (SOS) Dynamic Programming ใน C++

    บทนำ โจทย์: กำหนดอาร์เรย์ A ขนาด 2ⁿ คำนวณ F(x) = Σ A[i] สำหรับทุก i ที่เป็น subset ของ x (i & x == i) สำหรับทุก x = 0..2ⁿ-1 ตัวอย่าง A = [5, 7, 1, 9], n = 2 x=0 (00): subset={00} → F=5 x=1 (01): subset={00,01} → F=5+7=12 x=2 (10): subset={00,10} → F=5+1=6 x=3 (11): subset={00,01,10,11} → F=5+7+1+9=

  6. ผลรวมอนุกรม 1 + (1+3) + (1+3+5) + ... + (1+3+...+(2n-1)) ใน C++

    บทนำ หาผลรวมของอนุกรม: S = Σᵢ₌₁ⁿ (Σⱼ₌₁ⁱ (2j-1)) โดยที่ Σⱼ₌₁ⁱ (2j-1) = i² (ผลรวมเลขคี่ i ตัวแรก) วิธีที่ 1: Nested Loops (O(n²)) int calcSum(int n) { int sum = 0; for (int i = 1; i <= n; i++) { int value = 1; for (int j = 1; j <= i; j++) { sum += value;

  7. พิมพ์ Longest Common Subsequences ทั้งหมดเรียง Lexicographical ใน C++

    บทนำ โจทย์: หา Longest Common Subsequence (LCS) ทุกแบบที่เป็นไปได้ของสตริงสองตัว แล้วพิมพ์เรียง Lexicographical Order ตัวอย่าง str1 = xysxysx, str2 = xsyxsyx LCS ทั้งหมด: xsxsx, xsxyx, xsysx, xysyx, xyxsx, xyxyx แนวทางแก้ปัญหา DP หาความยาว LCS (DP[i][j] = LCS length ของ suffix i, j) Backtracking

  8. แปลงตัวเลขเป็นสตริง 'A' และ 'B' แบบ Lexicographic Order ใน C++

    บทนำ การแทนตัวเลขด้วยสตริง A และ B แบบ Lexicographic: 1=A, 2=B, 3=AA, 4=AB, 5=BA, 6=BB, 7=AAA, 8=AAB, ... ข้อสังเกต คล้าย Binary Number: A=0, B=1 แต่เริ่มนับจาก 1 ไม่ใช่ 0 ความยาว 1: 2 ตัว (1-2) ความยาว 2: 4 ตัว (3-6) ความยาว 3: 8 ตัว (7-14) รวมถึงความยาว L: 2^(L+1) - 2 ตัว ขั้นตอนการแก้ปัญหา หาค

  9. หลักการจัดการความเสี่ยงและ Paradigm ใน C++

    บทนำ Risk Management (การจัดการความเสี่ยง) คือการวิเคราะห์และจัดการทรัพยากรเพื่อลดผลกระทบจากความเสี่ยงในโครงการพัฒนาซอฟต์แวร์ 5 หลักการพื้นฐาน (Principles) Global Perspective: มองความเสี่ยงในบริบทของระบบและธุรกิจโดยรวม Forward Looking View: วางแผนจัดการความเสี่ยงที่อาจเกิดในอนาคต Open Communicatio

  10. การแยกตัวประกอบเฉพาะด้วย Sieve O(log n) สำหรับหลาย Query ใน C++

    บทนำ Prime Factorization แบบปกติ O(√n) ช้าสำหรับหลาย Query ใช้ Sieve of Eratosthenes เตรียม Smallest Prime Factor (SPF) ไว้ก่อน แล้วแยกตัวประกอบได้ O(log n) ต่อ Query ขั้นตอน สร้างอาร์เรย์ SPF ขนาด N+1 โดย SPF[i] = ตัวหารเฉพาะน้อยที่สุดของ i Sieve: เริ่ม SPF[i] = i, แล้วสำหรับทุก i ที่เป็นเฉพาะ (S

  11. หาผลรวมระดับสูงสุดใน Binary Tree ใน C++

    บทนำ โจทย์: หาระดับ (Level) ของ Binary Tree ที่มีผลรวมค่าโหนดมากที่สุด (รองรับค่าลบได้) ขั้นตอนการแก้ปัญหา Level Order Traversal (BFS) ด้วย Queue แต่ละรอบ while: ประมวลผลโหนดทั้งหมดในระดับนั้น (นับด้วย queue size) คำนวณผลรวมระดับ (levelSum) อัปเดต maxSum = max(maxSum, levelSum) ตัวอย่างโค้ด #inc

  12. หาตัวเลขสูงสุดที่สร้างได้จากการสลับสูงสุด K ครั้งใน C++

    บทนำ โจทย์: กำหนดตัวเลข n และจำนวนครั้งสลับสูงสุด k หาตัวเลขสูงสุดที่สร้างได้จากการสลับตัวเลขไม่เกิน k ครั้ง ตัวอย่าง n = 538, k = 1 → สลับ 5 กับ 8 ได้ 835 (สูงสุด) แนวทางแก้ปัญหา ใช้ Backtracking (DFS) ลองสลับทุกคู่ที่เป็นไปได้ (i, j) โดยที่ i < j และ digit[i] < digit[j] (สลับเพื่อให้ใหญ่ขึ้น) แล

  13. ลบสมาชิกอาร์เรย์ด้วยสองรอบลูปและหนึ่งรอบลูปใน C++

    วิธีที่ 1: สองรอบลูป (Two Traversals) รอบแรก: หาตำแหน่งของค่าที่จะลบ รอบที่สอง: เลื่อนสมาชิกหลังตำแหน่งนั้นมาหนึ่งช่อง โค้ด int searchAndDeleteElement(int arr[], int n, int k) { int i; for (i = 0; i < n; i++) { if (arr[i] == k) break; } if (i < n) { n = n - 1;

  14. ลบสมาชิกอาร์เรย์ในช่วงดัชนี [L, R] ใน C++

    บทนำ ลบสมาชิกในอาร์เรย์ตั้งแต่ดัชนี L ถึง R (inclusive) โดยเลื่อนสมาชิกที่เหลือมาบรรจุช่องว่าง ขั้นตอนการแก้ปัญหา วนลูป i = 0 ถึง n-1 ถ้า i ไม่อยู่ในช่วง [L, R] → คัดลอก arr[i] ไป arr[newIndex] แล้ว newIndex++ คืนค่า newIndex เป็นขนาดใหม่ ตัวอย่างโค้ด #include <bits/stdc++.h> using namespa

  15. ลบโหนดใบที่มีค่า x ใน Binary Tree ใน C++

    บทนำ โจทย์เดียวกับบทความก่อนหน้า (ID 1004078489) แต่นามพารามิเตอร์ต่างกัน (x แทน k) เนื้อหาและโค้ดเหมือนกันทุกประการ ตัวอย่างโค้ด #include <bits/stdc++.h> using namespace std; struct Node { int data; struct Node *left, *right; }; struct Node* newNode(int data) { struct Node* new

  16. ลบโหนดใบที่มีค่า k ใน Binary Tree ใน C++

    บทนำ ลบโหนดใบ (Leaf Node) ที่มีค่าเท่ากับ k ออกจาก Binary Tree โดยใช้ Recursive Post-order Traversal ขั้นตอนการแก้ปัญหา Recursive ไปยังลูกซ้ายและขวาก่อน อัปเดต left/right pointer ด้วยผลลัพธ์จาก recursive call ถ้าโหนดปัจจุบันเป็นใบ (left=null, right=null) และ data == k → คืน NULL (ลบ) มิฉะนั้น → คื

  17. ลบโหนดกลางของ Linked List ใน C++

    บทนำ ลบโหนดกลาง (Middle Node) ของ Linked List ใช้เทคนิค Two Pointers (Slow & Fast) หลักการ Two Pointers Slow pointer เดินทีละ 1 โหนด Fast pointer เดินทีละ 2 โหนด เมื่อ Fast ถึงท้าย Slow จะอยู่ตรงกลาง ต้องเก็บ Previous ของ Slow ไว้เพื่อตัดลิงก์ ขั้นตอนการแก้ปัญหา ถ้า List ว่างหรือมี 1 โหนด → ลบแ

  18. ลบ N โหนดหลัง M โหนดใน Linked List ใน C++

    บทนำ โจทย์: ใน Linked List ให้เก็บ M โหนด แล้วลบ N โหนดถัดไป ทำซ้ำจนจบ List ตัวอย่าง M=1, N=2, List: 1→2→3→4→5→6→7→8→9 เก็บ 1, ลบ 2,3 → เก็บ 4, ลบ 5,6 → เก็บ 7, ลบ 8,9 ผลลัพธ์: 1→4→7 ขั้นตอนการแก้ปัญหา เดินไป M-1 โหนด (เก็บ M โหนด) จากนั้นลบ N โหนดถัดไป (เก็บ pointer ถัดไปไว้ก่อนลบ) เชื่อมโหนดปัจ

  19. ลบ Binary Tree ด้วย Destructor และ delete keyword ใน C++

    บทนำ ใน C++ สามารถลบ Binary Tree ทั้งต้นได้อัตโนมัติโดยใช้ Destructor (~) ในคลาส Node เมื่อเรียก `delete root` จะเรียก destructor แบบ Recursive ลบลูกซ้าย ลูกขวา แล้วค่อยลบตัวเอง หลักการทำงาน Destructor ชื่อ ~Node() ใน destructor: `delete left; delete right;` → เรียก destructor ของลูกซ้ำ Post-order

Total 6007 -คอมพิวเตอร์  FirstPage PreviousPage NextPage LastPage CurrentPage:249/301  20-คอมพิวเตอร์/Page Goto:1 243 244 245 246 247 248 249 250 251 252 253 254 255