ภาพรวม
การหาตัวอักษรที่เกิดขึ้นบ่อยที่สุด (Highest Occurring Character) ในสตริง สามารถทำได้โดยนับจำนวนครั้งที่แต่ละตัวอักษรปรากฏ แล้วหาค่าสูงสุด
ตัวอย่าง: สตริง "apples are red" → ตัวอักษร 'e' ปรากฏ 3 ครั้ง (มากที่สุด)
ตัวอย่างโปรแกรม
using System;
namespace CharCountDemo
{
public class Example
{
public static void Main()
{
string str = "abracadabra";
int[] charCount = new int[256]; // ASCII 0-255
int length = str.Length;
// นับจำนวนครั้งของแต่ละตัวอักษร
for (int i = 0; i < length; i++)
charCount[str[i]]++;
// หาตัวอักษรที่มีจำนวนมากที่สุด
int maxCount = -1;
char maxChar = ' ';
for (int i = 0; i < length; i++)
{
if (maxCount < charCount[str[i]])
{
maxCount = charCount[str[i]];
maxChar = str[i];
}
}
Console.WriteLine("สตริง: " + str);
Console.WriteLine("ตัวอักษรที่พบมากที่สุด: " + maxChar);
Console.WriteLine("จำนวนครั้ง: " + maxCount);
}
}
}ผลลัพธ์
สตริง: abracadabra ตัวอักษรที่พบมากที่สุด: a จำนวนครั้ง: 5
คำอธิบายอัลกอริทึม
1. สร้างอาร์เรย์นับ (Frequency Array)
int[] charCount = new int[256]; // รองรับ ASCII 0-255
for (int i = 0; i < length; i++)
charCount[str[i]]++;ใช้ค่าตัวอักษร (char) เป็นดัชนีโดยตรง เพราะ char ใน C# เป็น UTF-16 (0-65535) แต่ตัวอย่างใช้ ASCII 256 ตัวแรก
2. หาค่าสูงสุด
int maxCount = -1;
char maxChar = ' ';
for (int i = 0; i < length; i++)
{
if (maxCount < charCount[str[i]])
{
maxCount = charCount[str[i]];
maxChar = str[i];
}
}วนลูปผ่านสตริงอีกครั้ง (ไม่ใช่วนอาร์เรย์ 256) เพื่อรักษาลำดับ: หากมีตัวอักษรหลายตัวเท่ากันมากที่สุด จะเลือกตัวที่ปรากฏก่อนในสตริง
การปรับปรุงสำหรับ Unicode (รองรับไทย, อีโมจิ, ฯลฯ)
using System;
using System.Collections.Generic;
using System.Linq;
public class Demo
{
public static void Main()
{
string str = "สวัสดีครับ 😀😀😀";
// ใช้ Dictionary รองรับ Unicode ทุกตัว
var freq = new Dictionary();
foreach (char c in str)
{
if (char.IsWhiteSpace(c)) continue; // ข้าม whitespace ถ้าต้องการ
freq[c] = freq.GetValueOrDefault(c, 0) + 1;
}
// หาค่าสูงสุดด้วย LINQ
var max = freq.OrderByDescending(kvp => kvp.Value).First();
Console.WriteLine($"สตริง: {str}");
Console.WriteLine($"ตัวอักษรมากที่สุด: '{max.Key}' (U+{(int)max.Key:X4})");
Console.WriteLine($"จำนวน: {max.Value} ครั้ง");
}
} ผลลัพธ์ Unicode
สตริง: สวัสดีครับ 😀😀😀 ตัวอักษรมากที่สุด: '😀' (U+1F600) จำนวน: 3 ครั้ง
ข้อสังเกตสำคัญ
- อาร์เรย์ 256 เหมาะสำหรับ ASCII/Extended ASCII เท่านั้น
- C# char = UTF-16 (16-bit) ต้องใช้อาร์เรย์ 65536 หรือ Dictionary สำหรับ Unicode เต็ม
- ควรตัดสินใจว่าจะนับ whitespace/punctuation หรือไม่
- กรณีเท่ากัน (tie) โค้ดตัวอย่างเลือกตัวที่ปรากฏก่อนในสตริง
- LINQ
GroupByทำได้สั้นกว่า:str.GroupBy(c => c).OrderByDescending(g => g.Count()).First()