給定任一字符串(可以有中文),長度為任意,要求找出其出現次數最多的字符及計算次數。
using System;
using System.Collections.Generic;
using System.Text;
namespace Test
{
class Program
{
public static void getMaxchar(String s)
{
char[] c = s.ToCharArray();
item[] ht = new item[c.Length]; //最壞的情況下(每個字符均不一樣),需要c.Length個存儲單元
for (int i = 0; i <= c.Length - 1; i++)
{ //賦初值,防止出現空指針引用 ********小心******
ht[i] = new item();
}
item Maxitem = ht[0];
for (int i = 0; i <= c.Length - 1; i++)
{
int unicode = (int)c[i]; // 獲得字符的unicode值 ()
int position = unicode % c.Length; //自定義的Hash函數
if (ht[position].count == 0)
{ //第一次掃描到的字符放入數組中
ht[position].a = c[i];
ht[position].count = 1;
}
else
if (ht[position].a == c[i]) //掃描到了同樣的字符,count加1
ht[position].count++;
else
for (int j = position + 1; j != position - 1; position++)
{ //Hash表發生地址沖突,用線形探測法解決地址沖突
if (ht[position].count == 0)
{
ht[position].a = c[i];
ht[position].count = 1; //找到空位置,插入
break;
}
for (int i = 1; i <= c.Length - 1; i++)
{ //遍歷數組,找到一個最大值
if (ht[i].count > Maxitem.count)
Maxitem = ht[i];
}
for (int i = 1; i <= c.Length - 1; i++)
{ //遍歷數組,找到所有的最大值,譬如”31212“這種多個最大值情況
if (ht[i].count == Maxitem.count)
Console.WriteLine("出現次數最多的字符是:" + ht[i].a + " 次數是:" + ht[i].count);
}
}
static void Main(string[] args)
{
getMaxchar(("本代碼IT5552341985euiollgjIT5riugjkj51ITIT1IT45ITITdjjkklITITdfjIT陽"));
Console.ReadLine();
}
}
class item
{ //定義哈希表中的元素
public char a;
public int count=0;
public item()
{
this.a = '' '';
this.count = 0;
}
}
}