当前位置:编程学习 > C#/ASP.NET >>

关于字符串的截取问题

给定一个字符串,可能含有殊字符、可能含有数字、可能含有字母……顺序不定,求出现该字符串出现的频率最高的字符并打印。 --------------------编程问答--------------------
循环每个 char,然后计数 --------------------编程问答--------------------
引用 1 楼 0009 的回复:
循环每个 char,然后计数

也可以用正则匹配 --------------------编程问答-------------------- string[] aa="ssdfsdfdsfdsfdsfsa";
arraylist counta=new arraylist[aa.length];
for(int i=0;i<aa.length;i++)
{
counta[i]=0;
}
for(int i=0;i<aa.length;i++)
{
    for(int j=0;j<aa.length;j++)
    {
        if(i==j)
        {
              connta[i]+=1;
        }
    }
}
int maxnum=0;
for(int i=0;i<aa.length;i++)
{
if(counta[i]>maxnum)
{
maxnum = counta[i];
}
}

response.write maxnum;

随手写的,没有调试,不过大概的思想就这样。。你调试一下吧,呵呵 --------------------编程问答-------------------- UP --------------------编程问答-------------------- 3楼答案不错! --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 我来写一个:

            string str = "sfja;c2p34n53c&@)(oquoru@u@c)(@)c";
            int iMaxResult = 0;
            foreach (char c in str)
            {
                iMaxResult = iMaxResult > str.Split(c).Length ? iMaxResult : str.Split(c).Length;
            }
            return iMaxResult;


大概意思就是:
遍历这个字符串,然后用遍历的每一项分割这个字符串,分割的段数最多的那个char,就是出现频率最高的.
不知道可行否 --------------------编程问答-------------------- 写错了,重写下

            string str = "sfja;c2p34n53c&@)(oquoru@u@c)(@)c";
            int iMaxResult = 0;
            char cResult;
            foreach (char c in str)
            {
                if (iMaxResult > str.Split(c).Length)
                {
                    iMaxResult = str.Split(c).Length;
                    cResult = c;
                }
            }
            return cResult;
--------------------编程问答-------------------- 晕,又错了,判断那是这样的:if (iMaxResult < str.Split(c).Length) --------------------编程问答-------------------- 能否测试出现频率最高的“单词”(以空格为界),不是单个字符 --------------------编程问答--------------------
string str = "abcde1234567777777";
Dictionary<char,int> dic = new Dictionary<char,int>();
foreach (char c in str)
{
    if (dic.ContainsKey(c))
    {
        dic[c]++;
    }
    else
    {
        dic.Add(c, 1);
    }
}
int max = 0; 
char maxchar = '\0';
foreach (char c in dic.Keys)
{
    if (dic[c] > max)
    {
        max = dic[c];
        maxchar = c;
    }
}
Console.WriteLine("出现的频率最高的字符" + maxchar.ToString() + ",共出现" + max.ToString()+"次");
--------------------编程问答-------------------- 我的这个应该是最直接最易懂的方式了
用一个Dictionary<char,int>记录每个字符的个数
只有两个单循环,效率也不低~ --------------------编程问答-------------------- 7 8 9楼的代码最短,但是不易懂,而且如果字符串很大的话,用Split效率极其低下 --------------------编程问答-------------------- 7 8 9楼的代码有个致命的缺陷,如果字符串中最长的那个字符在字符串的第一位和最后一位的时候没有处理;这样就会得出错误的结果,并且没有取出来那个字符最长! --------------------编程问答-------------------- 顶礼膜拜
我这种小白只能用最原始的循环加键值对或二维数组来实现了 --------------------编程问答-------------------- 找一个正则 --------------------编程问答--------------------
			string strTest="abcaaaadd\\eeeeeeeeeeeee";
string strFind="";
string strRep="";
int intMax=0;
int intRep=0;
while (strTest.Length > 0){
strRep = strTest.Substring(0,1);
intRep = strTest.Length;
strTest = strTest.Replace(strRep,"");
intRep = intRep-strTest.Length;
if(intRep>intMax){
strFind = strRep;
intMax = intRep;
}
}

MessageBox.Show(strFind);
--------------------编程问答-------------------- 可以设置变量,计数,在去比较 --------------------编程问答-------------------- 听起来像冒泡 --------------------编程问答-------------------- 谁能帮我解释下3楼的一个嵌套循环是什么意思? --------------------编程问答-------------------- 11楼说的方法,在机器上怎样测试? --------------------编程问答-------------------- 传说Linq很强大...
var str = "sfja;c2p34n53c&@)(oquoru@u@c)(@)c";
var g = str.GroupBy(s => s).OrderByDescending(o => o.Count());
foreach (var item in g)
{
Console.WriteLine("字符 {0} 共 {1} 个", item.Key, item.Count());
}

//字符 c 共 4 个
//字符 @ 共 4 个
//字符 ) 共 3 个
//字符 u 共 3 个
//字符 3 共 2 个
//字符 ( 共 2 个
//字符 o 共 2 个
//字符 s 共 1 个
//字符 f 共 1 个
//字符 j 共 1 个
//字符 a 共 1 个
//字符 ; 共 1 个
//字符 2 共 1 个
//字符 p 共 1 个
//字符 4 共 1 个
//字符 n 共 1 个
//字符 5 共 1 个
//字符 & 共 1 个
//字符 q 共 1 个
//字符 r 共 1 个

ps:你们好像都忽略了一点,出现频率最高的字符很可能不止一个... --------------------编程问答--------------------
引用 22 楼 vrhero 的回复:
传说Linq很强大...
C# codevar str="sfja;c2p34n53c&@)(oquoru@u@c)(@)c";var g= str.GroupBy(s=> s).OrderByDescending(o=> o.Count());foreach (var itemin g)
{
Console.WriteLine("字符 {0} 共 {1} 个", item.Key, item.Count());
}//字符 c 共 4 个//字符 @ 共 4 个//字符 ) 共 3 个//字符 u 共 3 个//字符 3 共 2 个//字符 ( 共 2 个//字符 o 共 2 个//字符 s 共 1 个//字符 f 共 1 个//字符 j 共 1 个//字符 a 共 1 个//字符 ; 共 1 个//字符 2 共 1 个//字符 p 共 1 个//字符 4 共 1 个//字符 n 共 1 个//字符 5 共 1 个//字符 & 共 1 个//字符 q 共 1 个//字符 r 共 1 个
ps:你们好像都忽略了一点,出现频率最高的字符很可能不止一个...


学习、学习 --------------------编程问答-------------------- 主要就是在程序中使用Split函数, --------------------编程问答--------------------
			string strTest="abcabcabcabcdefbbbbb";
System.Collections.ArrayList arrFind = new ArrayList();
string strRep="";
int intMax=0;
int intRep=0;
while (strTest.Length > 0){
strRep = strTest.Substring(0,1);
intRep = strTest.Length;
strTest = strTest.Replace(strRep,"");
intRep = intRep-strTest.Length;
if(intRep>intMax)
{
arrFind.Clear();
arrFind.Add(strRep);
intMax = intRep;
}
else if(intRep==intMax){
arrFind.Add(strRep);
}
}

foreach (object objout in arrFind){
System.Console.WriteLine(objout.ToString());
}

不止一个的处理方法
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,