黑马程序员技术交流社区

标题: ---”,不区分大小写,打印“W 2”“e 2”“l 3”这个题目... [打印本页]

作者: Cacerine    时间: 2014-7-14 09:42
标题: ---”,不区分大小写,打印“W 2”“e 2”“l 3”这个题目...
本帖最后由 Cacerine 于 2014-7-15 08:43 编辑

计算字符串中每种字符出现的次数。“Welcome to Chinaworld”,不区分大小写,打印“W 2”“e 2”“l 3”...
这个题目我纠结了一下都没有思路,来论坛求帮忙
还有一个题目
文本文件中存储了多个文章标题、作者,标题和作者之间用若干空格(数量不定)隔开,每行一个,标题有的长有的短,输出到控制台的时候最多标题长度10,如果超过10,则截取长度8的子串并且最后添加“...”,加一个竖线后输出作者的名字。
这个是用控制台应用程序吗????求帮忙,捋思路!
作者: _xixi_    时间: 2014-7-14 10:51
本帖最后由 _xixi_ 于 2014-7-14 10:53 编辑

第一道题,先将字符串全部转换为小写,写个循环,删除当前字符,记录下字符,在删除后的字符中查找,找到的话加1,循环直到字符串长度为0停止;第一道题我还真去做了~~
  1. namespace FindTheSame
  2. {
  3.     class Program
  4.     {
  5.         static void Main(string[] args)
  6.         {
  7.             string str = "Welcome to Chinaworld";

  8.             str = str.ToLower();
  9.             while(str.Length>0)
  10.             {
  11.                 int sum = 1;
  12.                 char current = str[0];
  13.                 str = str.Remove(0, 1);
  14.                
  15.                 while (str.Contains(current))
  16.                 {
  17.                     str = str.Remove(str.IndexOf(current), 1);
  18.                     sum++;
  19.                 }
  20.                 Console.Write("{0}:{1}  ", current, sum);
  21.             }
  22.             Console.ReadKey();
  23.         }
  24.     }
  25. }
复制代码

第二道题,先读取文本,file.readallline(),这样会得到一个string数组,每一项都是文本里面的一行,对每个string进行处理,str.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries);这样str[0]就是标题了,判断长度,然后截取(substring),然后~~~这是我的思路而已。
作者: StartHeiMa    时间: 2014-7-14 12:04
我刚做的:
//计算字符串中每种字符出现的次数。“Welcome to Chinaworld”,不区分大小写,打印“W 2”“e 2”“l 3”……
        static void Main(string[] args)
        {
            String cstr = "Welcome to Chinaworld";
            String Letter = "abcdefghijklmnopqrstuvwxyz";
            String wstr = "";
            int count = 0;

            for (int n = 0; n < Letter.Length; n++)
            {
                wstr = Letter[n].ToString();
                for (int i = 0; i < cstr.Length; i++)
                {
                    if (Letter[n] == cstr[i] || Letter[n] == cstr[i] + 32)
                    {
                        count++;
                    }
                }

                if(count != 0)
                {
                    Console.WriteLine(wstr + " " + count.ToString());
                    count = 0;
                }
            }
            Console.ReadLine();
        }
作者: 向晓伟    时间: 2014-7-14 13:56
用Dictionary<TKey, TValue> Class
作者: 乔相坤    时间: 2014-7-14 14:38
路过,学习一下
作者: Mekor    时间: 2014-7-14 15:43
第一题:用Dictionary
第二题:Substring
作者: Cacerine    时间: 2014-7-14 16:38
本帖最后由 Cacerine 于 2014-7-14 16:41 编辑

谢谢楼上各位的帮忙,不过我用自己的方法写出来啦!
  1. static void Main(string[] args)
  2.         {
  3.             string str = "Welcome to Chinaworld";
  4.             //将字符串的格式转换为小写
  5.             str = str.ToLower();
  6.             //因为需要改变str的值,所以转换成为了一个char数组
  7.             char[] c = str.ToCharArray();
  8.             for (int i=0; i < c.Length; i++)
  9.             {
  10.                 //判断当前位置的下标是否为空格,如果不是空格,则进入比较的循环
  11.                 if (c[i] != ' ')
  12.                 {
  13.                     //定义接收次数的变量count
  14.                     int count = 1;
  15.                     //因为是顺序比较,比较可以从当前位置向后来进行比较
  16.                     for (int j = i + 1; j < c.Length; j++)
  17.                     {
  18.                         //如果当前位置的字符与后面的字符相等
  19.                         if (c[i] == c[j])
  20.                         {
  21.                             //那么次数+1
  22.                             count++;
  23.                             //并把与当前位置下标字符相等的比较字符设置为空格,避免出现重复
  24.                             c[j] = ' ';
  25.                         }
  26.                     }
  27.                     Console.Write("\"{0} {1}\"  ", c[i], count);
  28.                 }
  29.             }
  30.             Console.ReadKey();
  31.         }
复制代码




作者: Cacerine    时间: 2014-7-14 16:45
_xixi_ 发表于 2014-7-14 10:51
第一道题,先将字符串全部转换为小写,写个循环,删除当前字符,记录下字符,在删除后的字符中查找,找到的 ...

你的思路跟我昨天想的一样,不过你的函数我不太会用,最后还是用最简单的for循环做出来了!
在下面,你可以看一下
作者: Cacerine    时间: 2014-7-14 16:47
StartHeiMa 发表于 2014-7-14 12:04
我刚做的:
//计算字符串中每种字符出现的次数。“Welcome to Chinaworld”,不区分大小写,打印“W 2”“ ...

额,这个功能可以实现,我用了最简单的for循环做出来了,在下面,你看一下,有没有打开你的思路!
作者: _xixi_    时间: 2014-7-14 16:52
Cacerine 发表于 2014-7-14 16:45
你的思路跟我昨天想的一样,不过你的函数我不太会用,最后还是用最简单的for循环做出来了!
在下面,你可 ...

这样子少计算了空格字符哦,不要替换成空格了,换个其他的应该就行了
作者: Cacerine    时间: 2014-7-14 16:55
_xixi_ 发表于 2014-7-14 16:52
这样子少计算了空格字符哦,不要替换成空格了,换个其他的应该就行了

空格字符也要吗????
我以为只要字符,去掉空格!!!!!
作者: czwanglei    时间: 2014-7-14 20:12
当有人给你回复后,请及时把帖子编辑为提问结束,这样版主才给你加分
作者: muyyi    时间: 2014-7-14 20:26
说下思路,第一题
用for遍历这个字符串
将遍历到的字符与其他每一个字符做比较,相同的时候计数器+1
也就是双重循环
注意可能出现的重复问题,比如最后结果只输出一次W 2,这可以用index值来区分,如果相同的字符出现在当前字符的前面,那么就证明不是第一次出现了,直接跳出本次循环
最后,不区分大小写应该没什么问题吧,统一转化为大写或小写再计数

第二题
截取字符串请参考substring方法

如果LZ实在看了思路还不清楚,我可以放下我当初做的源代码
不过还是请先自己思考吧
作者: 致立    时间: 2014-7-14 21:35
第一题, 你看下Dictionary字典这个泛型集合的用法,这题是用这种键值对集合来做的。
作者: c19t043    时间: 2014-7-16 08:45
本帖最后由 c19t043 于 2014-7-16 08:50 编辑

首先来看第一题,
计算字符串中每种字符出现的次数。“Welcome to Chinaworld”,不区分大小写,打印“W 2”“e 2”“l 3”...
我基础差,我就会用数组——2个数组,2个for循环完成这题
    class Program
    {
        static void Main(string[] args)
        {
            //计算字符串中每种字符出现的次数。“Welcome to Chinaworld”,不区分大小写,打印“W 2”“e 2”“l 3”...
            string str1 = "Welcome to Chinaworld";
            Console.WriteLine(str1);
            str1 = str1.ToLower();
            //将原字符串,转换为,单个字符数组char1
            char[] char1 = str1.ToArray();
            //记录对应索引下,该字符出现过的次数
            char[] char2 = new char[char1.Length];
            for (int i = 0; i <= char1.Length - 1; i++)
            {
                int count = 0;
                for (int j = 0; j <= char1.Length - 1; j++)
                {
                    if (char1 == char1[j])
                    {
                        count++;
                    }
                }
                char2 = Convert.ToChar(count);
            }
            //打印数组char1,每种字符出现的次数,如果数组char1中有相同字符,只打印一次
            for (int i = 0; i <= char1.Length - 1; i++)
   
         {
                if (char1 != ' ')
                {
                    for (int j = 0; j <= i; j++)
                    {
                        if (char1 == char1[j] && j < i) //将char1[j]与它前面的字符比较,如果有相同就退出该循环
                        {
                            break;
                        }
                        else if (j == i)//与之前的字符比较后,仍然没相同的就输出该字符
                        {
                            Console.WriteLine(char1.ToString() + Convert.ToInt32(char2));
                        }
                    }
                }
            }
            Console.ReadKey();
        }
    }


作者: 小郭zaiheima    时间: 2014-7-16 10:15
我是来学习的
作者: 专属第三    时间: 2014-7-16 11:43
本帖最后由 专属第三 于 2014-7-16 11:48 编辑
  1. string s = "Welcome to Chinaworld";
  2.             int ecishu = 0;
  3.            ecishu= System.Text.RegularExpressions.Regex.Matches(s, "[Ww]").Count;

  4.            Console.WriteLine("w"+" "+ecishu);
  5.            Console.ReadKey();
复制代码
基础加强里边有正则表达式,好像是第15个.

作者: Cacerine    时间: 2014-7-16 11:46
专属第三 发表于 2014-7-16 11:43
基础加强里边有正则表达式,好像是第15个.学习C#完全就是为了就业,而你就业的时候只掌握基本知识来做题可以 ...

?????你这是..................
作者: 昕☆Rainbow    时间: 2014-7-16 12:46
_xixi_ 发表于 2014-7-14 10:51
第一道题,先将字符串全部转换为小写,写个循环,删除当前字符,记录下字符,在删除后的字符中查找,找到的 ...

这个方法很不错啊 不过14行可以去掉吧 直接初始化sum=0 结果也是一样的 这样写代码有点重复
作者: 童心    时间: 2014-7-16 14:31
好多方法啊
作者: 麦田怪圈    时间: 2014-7-16 15:51
路过学习长知识!
作者: _xixi_    时间: 2014-7-16 17:54
昕☆Rainbow 发表于 2014-7-16 12:46
这个方法很不错啊 不过14行可以去掉吧 直接初始化sum=0 结果也是一样的 这样写代码有点重复 ...

不错,你说的对:handshake
作者: 蜗牛阿布    时间: 2014-7-22 01:01
这题我也想了很久,资料也找了,这个题目我现在是理解了,
因为代码是网上资料找的,自己这题刚开始真心不懂,不懂就是不懂,我也不装。
我就每个代码基本上都写了注释,现在我弄懂了。如果你实在不懂,先看我代码捋一下思路,或者跟着这个代码,自己写个伪代码
题目中的关键问题:
(1)不区分大小写
(2)怎么按每个字符串来计数.
想清楚思路了再照着敲打一遍,如果能够理解了。就不错。先把代码理解了来。
希望能够帮到你。

代码如下:

namespace test10
{
    class Program
    {
        static void Main(string[] args)
        {
        //计算字符串中每种字符出现的次数。“Welcome to Chinaworld”,不区分大小写,打印“W 2”“e 2”“l 3”……

        Console.WriteLine("请输入一段字母");
        string zm = Console.ReadLine();
        //将字符串都转换为小写形式
   // ---------------------------------------------------------------------------  
            zm = zm.ToLower();//把字符转换成小写字母.

            Dictionary<char,int> dict = new Dictionary<char,int>();//Dictionary.字典集合,键/值对

            char[] chs  =  zm.ToCharArray();//将字符串拆分成字符数组放入chs数组中。
  //-----------------------------------------------------------------------------

        for (int i = 0; i < chs.Length; i++)
        {
        //通过char的方法判断是否为字母,如果为字母,则进行下面的操作,
        //否则不操作
            if (char.IsLetter(chs[i]))
            {
                //如果不包含该键,则加入集合中
                if (!dict.ContainsKey(chs[i]))
                {
                    //将每个字符加入集合中对应键,其值初始为1
                    dict.Add(chs[i], 1);
                }
                else
                {
                    //否则,包含该键,只将其对应的值+1即可   值的类型为int
                    dict[chs[i]]++;
                }
            }


        }
        //循环遍历输出集合中的键 值
        foreach (KeyValuePair<char,int> kv in dict)
        {
        Console.WriteLine("字母:{0}{1}次。",kv.Key,kv.Value);
        }
        Console.ReadKey();

        }
        }
    }



作者: 别问我是谁    时间: 2014-7-24 21:09
你学到键值对Dictionary<TKey,TValue>没,,用这个很简单的
作者: 别问我是谁    时间: 2014-7-24 21:26
本帖最后由 别问我是谁 于 2014-7-24 21:34 编辑

/* static void Main(string[] args)
        {
            string str = "welcome to china";
            str=str.ToLower();//转为小写
            Dictionary<char, int> dic = new Dictionary<char, int>();//创建一个键值对,键是字符,值是对应的次数;
            for (int i = 0; i < str.Length ; i++)
            {
                if(str==' ') continue;//当为空格时,直接进入下一次循环
                if(!dic.ContainsKey (str))
                {
                    dic.Add(str, 1);//当键值对中没有这个键时,将其添加到键值对中,次数为1;
                }
                else //当键值对中已有这个键时
                {
                    dic[str]++; //键所对应的值加1;
                }
            }

            //遍历这个键值对
            foreach(KeyValuePair<char,int> kv in dic)
            {
                Console.WriteLine("{0}出现的次数是{1}", kv.Key, kv.Value);
            }

           Console.ReadKey();
        }
*/
-----------------------------------------------------这个界面有问题--------------------------------
竟然把我的字符串索引 i 当成了html文件的属性了。。。坑,,,害的我代码里面总显示不出来这个
作者: mouxingyu    时间: 2014-7-24 23:48
            string str = System.IO.File.ReadAllText(@"练习用.txt",Encoding.Default);
            //分格 空格和换行符的字符串  不返回空字符串数组
            string[] sArray = str.Split(new char[] { ' ', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
            //得到的应该都是 文章和作者成对的字符串。 前提文章中没有空格。
            for (int i = 0; i < sArray.Length; i += 2)
            {
                //存文章有可能改变 新建个字符串来保存来输出
                string temp;               
                if (sArray[i].Length > 8)
                {
                    //文章字符大于8个的只输出8个字符...赋值
                    temp = sArray[i].Substring(0, 8) + "...";
                }
                else
                {
                    //没有大于8个的正常输出赋值
                    temp = sArray[i];
                }
                //输出文章名|作者名 \t只是为了输出好看
                Console.WriteLine("{0}\t|\t{1}", temp, sArray[i + 1]);
            }
            Console.ReadKey();

看没有人写第二题。我写了一个不过局限性很大,不过能实现功能。学了正则表达式后会有简单的方法吧。
希望这个对楼主有用。
要是有什么错误的地方请指出。
作者: liangdmaster    时间: 2014-7-26 20:59
有这么多种解决方法,学到很多哦
作者: 赵贺景    时间: 2014-7-26 22:52
string str = "Welcome ,to Chinaworld";
//去掉没用的空格 标点符等 乱七八糟的东西 再用join 链接
            string str2 = string.Join("", str.Split(new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)).ToLower();//都转换成小写
            Dictionary<char, int> dic = new Dictionary<char, int>();//创建字典
            foreach (char ch in str2)
            {
                if (dic.ContainsKey(ch))
                {
                    dic[ch]++;//如果字母出现过 那就让值++ 累加
                }
                else
                {
                    dic[ch] = 1; //没有出现过 那就是第一次出现 次数为1
                }
            }
            foreach (char ch in dic.Keys)
            {
                Console.WriteLine("{0}--{1}", ch, dic[ch]);//遍历输出
            }
            Console.ReadKey();
        }
    }
}
作者: 麦田怪圈    时间: 2014-7-27 14:23
好厉害!学习了
作者: 伪善者。    时间: 2014-7-30 08:33
我是用的正则来做的 具体如下   这个是检测所有字符的

  1.             //定义初始字符串
  2.             string str1 = "Welcome to China!";

  3.             string str = str1.ToLower();//全部转换成小写
  4.             while (str != "")
  5.             {
  6.                 MatchCollection mc = Regex.Matches(str, str[0].ToString());//正则匹配
  7.                 Console.WriteLine("字符{0},出现了{1}次", str[0], mc.Count);

  8.                 str = Regex.Replace(str, str[0].ToString(), "");//每次匹配打印完成后都把匹配完成的字符移除,直到字符串为空 跳出循环

  9.             }

  10.             Console.ReadKey();
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2