更进:http://blog.csdn.net/sam_jdk/article/details/77459327
题目:将字符串分割为单个字符,并统计字符出现的次数,最后降序打印
字符串格式:"619827129871214178"
输出格式:
6:1
1:5
9:2
8:3
2:3
7:3
4:1
个人代码如下:
/*
* 缺点:1.二维数组资源存在浪费,即此方法不适合字符类别少,重复频度高的字符串
* 2.还是由于使用了string[,]二维数组,编码过程不直观,在int,string,char三个类型中转换
* 3.排序方法单一,相同频率的不同字符无法有效的排序
* 4.冒泡排序并非最合适的排序算法
*/
public Char_Frequency()
{
//string text = "iownlmweujdysakdsecswsqwgcxvbnf";
string text = "619827129871214178";
//string text = "吃葡萄不吐葡萄皮不吃葡萄倒吐葡萄皮";
//string text = "没想到讨论最后";
char[] ar=text.ToCharArray();
int key=0;
int j = 0;
//二维数组,比较浪费资源,因为可能会存在空间没有使用完,可以用交错数组
string[,] arrs = new string[2, ar.Length];
for (int i = 0; i < ar.Length;i++ )
{
//判定是否当前字符在arrs中存在
bool increase = true;
//循环检查当前字符
for (j = 0; j < key; j++)
{
if (arrs[0,j] != null && arrs[0,j].Equals(ar[i].ToString()))
{
arrs[1,j]=(Convert.ToInt32(arrs[1, j]) + 1).ToString();
increase = false;
}
}
//arrs新增当前字符
if (increase)
{
arrs[0, j] = ar[i].ToString();
arrs[1, j] = "1";
key++;
}
}
//遍历
for (int i = 0; i < key;i++ )
{
Console.WriteLine("{0}:{1}",arrs[0,i],arrs[1,i]);
}
Console.WriteLine("==========================");
//排序
bubblingSort(arrs, key);
for (int i = 0; i < key; i++)
{
Console.WriteLine("{0}:{1}", arrs[0, i], arrs[1, i]);
}
Console.ReadKey();
}
/// <summary>
/// 冒泡排序
/// </summary>
/// <param name="arr">数组</param>
/// <param name="limit">截止位置</param>
public void bubblingSort(string [,] arr,int limit)
{
string tmp="";
for (int i = 0; i < limit; i++)
{
for (int j = i; j < limit; j++)
{
int x = Convert.ToInt32(arr[1, i]);
int y = Convert.ToInt32(arr[1, j]);
if (x < y)
{
//交换数量
arr[1, i] = y.ToString();
arr[1, j] = x.ToString();
//交换字符
tmp=arr[0, i];
arr[0, i] = arr[0, j];
arr[0, j] = tmp;
}
}
}
}