A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 佘显郡 于 2013-10-21 11:05 编辑

//计算字符串中每种字符出现的次数。“Welcome to Chinaworld”,不区分大小写,打印“W 2”“e 2”“l 3”……(l冒失只出现2次)

这题关键点在哪?我认为是“W 2”这里,很多人想着就是直接string.ToLower()。很明显,得不到想要的结果。处理累计的话我想是泛型字典,当然也有很多其他方法,大同小异。求高手写下,如何区分大小写打印,以第一个出现的字母的大小写为标准。其实主要是求技术分,新人刚辞职,论坛也没玩过,求技术分,我要进黑马啊,求技术分。

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1 同学给你加分了!好好学习!蔡蔡和叶叶在黑马.

查看全部评分

12 个回复

倒序浏览
class Program
    {
        public struct arrayNode
        {
            public char Node;
            public int count;
        }

        static void Main(string[] args)
        {
            arrayNode[] array = new arrayNode[256];
            Console.WriteLine("请输入一个字符串");
            string str = Console.ReadLine();
            int count = 0;
            int m = 0;
            for (int i = 0; i < str.Length; i++)
            {
               
                for (int j = 0; j < str.Length; j++)
                {

                    if (str[i] == array[j].Node)
                    {
                        count++;
                        array[j].count++;
                    }

                }
                if (count != 0)
                {
                    m--;
                }
                if (count == 0)
                {
                    array[m].Node = str[i];
                    array[m].count = 1;
                }
                count = 0;
                m++;
            }

            for (int i = 0; array[i].Node != '\0' && array[i].count != 0; i++)
            {
                Console.WriteLine("{0}  {1}", array[i].Node, array[i].count);
            }

        }

        }
我不写注释你理解一下这段代码的思路,可以完成统计字符次数的功能,这是我写的,不要照抄哦

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
荣右铭 发表于 2013-10-20 16:14
class Program
    {
        public struct arrayNode

我测试题已经交了。
用了一个结构来存让我耳目一新,不过里面代码没看懂。为什么arrayNode[j]没有超出索引,你能稍稍解释下里面的循环跟判断吗?先谢了。最后冒失还是没有实现不区分大小写。
回复 使用道具 举报
单纯的统计的话,可以用个键值对,循环str,如果键不存在就添加键,如果存在值加1,最后输出键和值,关键这里怎么区分大小写呢,如何认为大写字母跟小写字母是同一个键
回复 使用道具 举报
  1.             string s = "Welcome to Chinaworld";
  2.             char[] c = s.ToCharArray();
  3.             var cc = c.GroupBy(e => e).OrderByDescending(e => e.Count()).ToList();
  4.             for (int i = 0; i < cc.Count; i++)
  5.             {
  6.                 Console.WriteLine("{0}出现了\t{1}次:", cc[i].Key.ToString(), cc[i].Count().ToString());
  7.             }
复制代码

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
佘显郡 发表于 2013-10-20 17:03
我测试题已经交了。
用了一个结构来存让我耳目一新,不过里面代码没看懂。为什么arrayNode[j]没有超出索引 ...

str和array结构数组中的任何一个元素相比较,判断是否出现重复
如果没有任何一次比较为真,就表明这个字母是第一次出现,就把这个字母写进结构数组的一个元素中
否则,出现了重复,那个对应的结构数组元素的count值加1,也就是记录了一次重复
如果字符串长度超过256,array的访问还是会越界的,这个问题就见仁见智了,这算一个隐藏的bug
还有变量m的作用,如果不用变量m,输出时会输出下许多没有字母名称的元素,那样虽然也能够统计出来
就不太好看
还有一个缺点就是没法忽略大小写了,可以用lower方法预先处理一下,也可以判断是不是和那个字母的ascii码+32或者减32后的值相等,因为在ascii码表中对应大小写字母总是相差32,lower方法其实也是这个原理。
希望能帮到你

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
楼主你好,如果您的问题得到解决,请及时把分类设为已解决,黑马有你更精彩!
回复 使用道具 举报
Console.WriteLine("请输入一行字符串:");

            string Str = Console.ReadLine();

            var source = Str.ToArray().GroupBy(a => a).Select(a => new { count = a.Count(), key = a.Key }).ToArray();

            foreach (var s in source)
            {
                Console.WriteLine("字符" + s.key + "出现的次数:" + s.count);

            }

            Console.ReadKey();
回复 使用道具 举报
本帖最后由 猫咪不吃糖 于 2013-10-20 18:53 编辑
  1.         static void Main(string[] args)
  2.         {
  3.             string str;
  4.             Dictionary<char, int> dic = new Dictionary<char, int>();
  5.             //输入字符串
  6.             //Console.Write("请输入字符串:");
  7.             str = "Welcome to Chinaworld";//Console.ReadLine();
  8.             //统计每个字符出现次数
  9.             foreach (char a in str)
  10.             {
  11.                 //统计每个字符出现次数
  12.                 if (dic.ContainsKey(char.ToLower(a))) dic[char.ToLower(a)]++;
  13.                 else dic.Add(char.ToLower(a), 1);
  14.             }

  15.             //输出每个字符出现的次数
  16.             foreach (KeyValuePair<char, int> key in dic)
  17.             {
  18.                 if(key.Key != ' ') Console.WriteLine("字符" + key.Key + "出现" + key.Value + "次。");
  19.             }

  20.             Console.ReadKey();
  21.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1 同学给你加分了!好好学习!蔡蔡和叶叶在黑马.

查看全部评分

回复 使用道具 举报
//用字典的key,walue配对解决
            string str = "W,e,l,c,o,m,e, t,o, C,h,i,n,a,w,o,r,l,d"; ;
            string[] arry = str.Split(',');
            Dictionary<string, int> st = new Dictionary<string, int>();
            foreach (string w in arry)
            {
                if (st.ContainsKey(w))
                {
                    st[w] += 1;
                }
                else
                {
                    st[w] = 1;
                }
            }
            foreach (var kv in st)
            {
                Console.WriteLine(string.Format("{0}:{1}", kv.Key, kv.Value));
            }

            Console.ReadKey();
回复 使用道具 举报
亲 你可以考虑下键值对 就是dictionary 这个实现比较简单哦
我说一下思路吧,代码我就不写了 还请楼主自己思考代码
首先new 一个<char,int>键值对并且using一下
然后使用foreach循环遍历整个字符串 在循环中判断这个字符有没有重复出现 如果有则这个字符所在的位置次数加1否则就添加这个字符
最后用foreach遍历整个键值对就可以了
回复 使用道具 举报
附上我最后提交的代码,欢迎大家多交流,写法好多。

//计算字符串中每种字符出现的次数。“Welcome to Chinaworld”,不区分大小写,打印“W 2”“e 2”“l 3”……
        //l好像只有2个
        static void Main(string[] args)
        {
            string str = "Welcome to Chinaworld";
            //string.ToLower();//得不到想要的打印结果

            //实例化一个字典,key存字母,value存出现次数
            Dictionary<char, int> dic = new Dictionary<char, int>();

            //循环遍历每一个字符(没用foreach,因为需要改变字母的大小写状态来实现忽略大小写,迭代循环不支持)
            for (int i = 0; i < str.Length; i++)
                        {
                //定义一个变量存当前遍历的字符
                char c = str[i];
                //如果不是字母,不统计,跳到下一次循环
                if (!char.IsLetter(c))
                {
                    continue;
                }
                //如果dic不包含“字符一摸一样”的key ;并且不包含“字母一样,大小写不同”的key ,则添加进dic
                if (!dic.ContainsKey(c)&!Equal(c,dic))
                {
                    dic.Add(c, 1);
                }
                //如果“字符一摸一样”的key已经存在,value+1
                else if (dic.ContainsKey(c))
                {
                    dic[c]++;
                }
                //字母一样,大小写却不同的情况
                else
                {
                    //判断,改变c的大小写后再通过dic[c]++,否则dic[c]会找不到key
                    if (char.IsLower(c))
                    {
                        c = c.ToString().ToUpper()[0];
                    }
                    else
                    {
                        c = c.ToString().ToLower()[0];
                    }
                    dic[c]++;
                }
                        }
            //格式化输出字典中所有键值对
            StringBuilder sb = new StringBuilder();
            foreach (KeyValuePair<char,int> item in dic)
            {
                sb.Append(string.Format("“{0} {1}”\t", item.Key, item.Value));
            }
            Console.WriteLine(sb);
            Console.ReadKey();
        }

        /// <summary>
        /// 判断c是否是dic中的“字母一样,大小写不同”的key
        /// </summary>
        /// <param name="c"></param>
        /// <param name="dic"></param>
        /// <returns></returns>
        static bool Equal(char c,Dictionary<char,int>dic)
        {
            bool state;
            //如果字母是小写,变成大写后再ContainsKey
            if (char.IsLower(c))
            {
                state = dic.ContainsKey(c.ToString().ToUpper()[0]);
            }
            //如果是大写,变成小写后再ContainsKey
            else
            {
                state = dic.ContainsKey(c.ToString().ToLower()[0]);
            }
            return state;
        }

评分

参与人数 1技术分 +2 收起 理由
追溯客 + 2 写得好加两分

查看全部评分

回复 使用道具 举报
追溯客 发表于 2013-10-20 18:34
楼主你好,如果您的问题得到解决,请及时把分类设为已解决,黑马有你更精彩!
...

版主,求给我来一发炮弹啊,都给别人加了

评分

参与人数 1技术分 +2 收起 理由
追溯客 + 2 同学给你加分了!好好学习!蔡蔡和叶叶在黑马.

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马