解决方案 »

  1.   

    建立一个计数器,扫描整个串,计数器可用Hash表实现,
    比如:var str = "xxxxx";
    Hashtable ht =new Hashtable();
    foreach(char c in str){
     if (ht[c]==null)ht[c]=0;
    ((int)ht[c])++;
    }
    if (str.length / ht.Count > 10) //10是一个阀值,可以设定 
      error("您在灌水");
      

  2.   

    嗯,完全不靠谱
    比如我想举个例子,所以需要用到大量的重复字符,比如abcd1abcd2abcd3abcd4abcd5
    难道这样就是灌水了?
    而如果我是随手乱敲进去,比如林地简欧风精灵交流立即分裂昂罗经理阿德里妇女file昂立
    一个重复字符都没有,但是内容毫无意义
      

  3.   

    这么一个算法都搞不定啊,在我看来是相当Easy的。
      

  4.   


            static void Main(string[] args)
            {
                var samples = new string[]{
                    "贵阳,一个夏天度假的好地方。那地方我确实去过,山好水好空气好,确实值得大家去玩一玩",
                    "你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷",
                    "sssssssssssssssssssssssssssssssssssss",
                    "................放屁放屁....……………操操操操…....................."
                };
                
                foreach(var item in samples)
                {
                    var rate = GetDuplicatedRate(item);
                    Console.Write("样本:");
                    Console.WriteLine(item);
                    Console.WriteLine("duplicatedRate = {0:00.00%}", rate);
                    Console.WriteLine();
                }
            }        static float GetDuplicatedRate(string input)
            {
                var length = input.Length;            //假定重复次数超过 字符串长度/3 就算恶意重复
                var minDuplicateRefer = length >> 3;            var duplicated = input.GroupBy(ch => ch)
                    .Select(g => new
                    {
                        Char = g.Key,
                        Count = g.Count()
                    })
                    .Where(ch => ch.Count > minDuplicateRefer)
                    .Sum(ch => ch.Count);            var duplicatedRate = (float)duplicated / length;            return duplicatedRate;
            }
    计算结果:
    样本:贵阳,一个夏天度假的好地方。那地方我确实去过,山好水好空气好,确实值得大家去玩一玩
    duplicatedRate = 00.00%样本:你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷
    duplicatedRate = 100.00%样本:sssssssssssssssssssssssssssssssssssss
    duplicatedRate = 100.00%样本:................放屁放屁....……………操操操操….....................
    duplicatedRate = 74.55%
      

  5.   

    更正:            //假定重复次数超过 字符串长度/8  就算恶意重复
                var minDuplicateRefer = length >> 3;
      

  6.   

    再次更正:            //假定重复次数超过 字符串长度/3 就算恶意重复,如果长度小于24,取值3。
                var minDuplicateRefer = length >= 24 ? length >> 3 : 3;
      

  7.   

     string abc = "123123123123123123123123123123";
                var array = abc.ToCharArray();            foreach (char item in array.Distinct())
                {
                    var count = array.Count(s => s.CompareTo(item) == 1);
                    Console.WriteLine(string.Format("{0}:{1}", item, count));
                }
                Console.Read();