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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘赛 中级黑马   /  2013-4-25 17:20  /  2373 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘赛 于 2013-4-26 16:02 编辑

在测试题中有一道面试题
  1. // 计算字符串中每种字符出现的次数(面试题)。
  2.         //“Welcome to Chinaworld”,不区分大小写,
  3.         // 打印“W 2”“e 2”“l 3”……
复制代码
我是这样写的
  1. string str = "Welcome to Chinaworld";
  2.             string str1 = str.ToLower();
  3.             char[] cc = str1.ToCharArray();
  4.             
  5.             int w = 0,e=0,l=0,c=0,o=0,m=0,t=0,h=0,i=0,n=0,a=0,r=0,d=0;
  6.             for(int x=0;x<cc.Length;x++)
  7.             {
  8.                 switch(cc[x])
  9.                 {
  10.                     case 'w':
  11.                         w++;
  12.                         break;
  13.                     case 'e':
  14.                         e++;
  15.                         break;
  16.                     case 'l':
  17.                         l++;
  18.                         break;
  19.                     case 'c':
  20.                         c++;
  21.                         break;
  22.                     case 'o':
  23.                         o++;
  24.                         break;
  25.                     case 't':
  26.                         t++;
  27.                         break;
  28.                     case 'h':
  29.                         h++;
  30.                         break;
  31.                     case 'i':
  32.                         i++;
  33.                         break;
  34.                     case 'n':
  35.                         n++;
  36.                         break;
  37.                     case 'a':
  38.                         a++;
  39.                         break;
  40.                     case 'r':
  41.                         r++;
  42.                         break;
  43.                     case 'd':
  44.                         d++;
  45.                         break;
  46.                     case 'm':
  47.                         m++;
  48.                         break;

  49.                 }
  50.             }
  51.             Console.WriteLine("w {0}", w);
  52.             Console.WriteLine("e {0}", e);
  53.             Console.WriteLine("l {0}", l);
  54.             Console.WriteLine("c {0}", c);
  55.             Console.WriteLine("o {0}", o);
  56.             Console.WriteLine("m {0}", m);
  57.             Console.WriteLine("t {0}", t);
  58.             Console.WriteLine("h {0}", h);
  59.             Console.WriteLine("i {0}", i);
  60.             Console.WriteLine("n {0}", n);
  61.             Console.WriteLine("a {0}", a);
  62.             Console.WriteLine("r {0}", r);
  63.             Console.WriteLine("d {0}", d);
  64.             Console.ReadKey();
复制代码
想问一下既然是面试题不可能这么简单吧,是不是有什么算法之类的,请高手给个更简单的写法

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1 z这是不可取的。自己先想想简便的方法,想.

查看全部评分

11 个回复

倒序浏览
嗯 我再想想看。
回复 使用道具 举报
好像要用递归
回复 使用道具 举报
算了先睡了 还是没想出来
回复 使用道具 举报
需要先用string.Split()将数据分割,得到一个字符串数组,
再通过string.Indexof()方法判断出现第一次的次数,用一个for循环将所有相同的找出来,
注意for循环要巧用Indexof("位置","长度"),位置在前一个基础上加上长度循环。
:)
回复 使用道具 举报
写了下,主要是用空格代替(Replace)已经扫描好的字符,再用空格分割(Split)字符串的方法,其中扫描字符个数用IndexOf方法,最后就是循环执行出结果了,代码如下:
  1.         static void Main(string[] args)
  2.         {
  3.             string str = "Welcome to Chinaworld";
  4.             str = str.ToLower();  
  5.             str = RemoverStringEmpty(str);    //调用方法,将字符串去空格处理
  6.             int[] pos = new int[str.Length];  //用int型数组记录第一个字符的位置                  
  7.             while (str != null)
  8.             {
  9.                 pos[0] = str.IndexOf(str[0]); //此处先进行一次判断
  10.                 int i = 0;
  11.                 for (i = 0; pos[i] != -1; i++) //IndexOf()返回值-1作为判断条件,说明没检索到e
  12.                 {
  13.                     pos[i + 1] = str.IndexOf(str[0], pos[i] + 1);//类似递归
  14.                 }
  15.                 Console.WriteLine("{0}的个数为{1}", str[0], i);//输出第一个字符的个数

  16.                 str = str.Replace(str[0], ' ');//将字符串中所有第一个字符替换成空格               
  17.                 str = RemoverStringEmpty(str);//这两步骤去掉了所有第一个字符,生成的字符串
  18.             }
  19.             Console.ReadKey();
  20.         }

  21.         //将传入的字符串去掉空格返回新的字符串
  22.         public static string RemoverStringEmpty(string str)
  23.         {
  24.             string[] sp = str.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
  25.             str = null;
  26.             for (int k = 0; k < sp.Length; k++)
  27.             {
  28.                 str = str + sp[k];
  29.             }
  30.             return str;
  31.         }
复制代码
回复 使用道具 举报
刘赛 中级黑马 2013-4-26 16:03:07
7#
虽然看不太懂先研究下
回复 使用道具 举报
黄晓波 黑马帝 2013-4-26 17:10:56
8#
  1. class Program
  2.     {
  3.         // 计算字符串中每种字符出现的次数(面试题)。
  4.         //“Welcome to Chinaworld”,不区分大小写,
  5.         // 打印“W 2”“e 2”“l 3”……

  6.         static void Main(string[] args)
  7.         {
  8.             string str = "Welcome to Chinaworld";
  9.             //将原字符串全部转换成小写
  10.             str = str.ToLower();
  11.             str = str.Replace(" ", "");
  12.             char[] strArry = str.ToCharArray();
  13.             for (int i = 0; i < str.Length; i++)
  14.             {
  15.                 int elementCount = GetElementCount(strArry, strArry[i]);
  16.                 Console.Write("\"{0} {1}\"\t", strArry[i], elementCount);
  17.             }
  18.             Console.ReadKey();
  19.         }

  20.         /// <summary>
  21.         /// 判断一个元素在字符串中出现的次数
  22.         /// </summary>
  23.         /// <param name="str">字符串</param>
  24.         /// <param name="element">元素</param>
  25.         /// <returns>元素出现的次数</returns>
  26.         static int GetElementCount(char[] str, char element)
  27.         {
  28.             //元素个数
  29.             int elementCount = 0;            
  30.             //计算元素个数
  31.             for (int i = 0; i < str.Length; i++)
  32.             {
  33.                 //判断字符串中的每个元素是否和元素相同,相同则表示出现了一次,否则进行下一次判断
  34.                 if (str[i].Equals(element))
  35.                 {
  36.                     elementCount++;
  37.                 }   
  38.             }
  39.             //返回元素出现的次数
  40.             return elementCount;
  41.         }
  42.     }
复制代码
回复 使用道具 举报
张振 中级黑马 2013-4-26 17:56:33
9#
本帖最后由 张振 于 2013-4-26 18:00 编辑

里面要用到泛型集合 Dictionary
如你这道题
string s="Welcome to ChinaWorld";
string str=s.replace(" ","").ToLower();//去掉空格,转成大写
//定义一个dictionary
Dictionary<char,int> dic = new Dictionary<>();
//遍历每个字符,并且添加到dic集合的键值中
foreach(char item in str)
{
//这个dic.ContainKey()返回值是个bool类型,判断dic中是否含有相应的item,
if(!dic.ContainsKey(item))
//如果没有则赋value值为1
dic.Add(item,1)
}
else
{
//如果还有则添加值为1
dic[item]=dic[item]+1;
}
//遍历输出
foreach(KeyValuePair<char,int>ke in dic)
{
console.writeline(ke.Key+" "+ke.Value);
}
如果这种输出你还没学到
就直接用foreach
foreach(char i  int  dic.Key)
{
console.write(i);
console.writeline(dic   );

}
console.readkey();





回复 使用道具 举报
张振 发表于 2013-4-26 17:56
里面要用到泛型集合 Dictionary
如你这道题
string s="Welcome to ChinaWorld";

显示出现问题了
最后那个dic
回复 使用道具 举报
泛型还没接触到,不过你们说的意思大致明白了。{:soso_e181:}
回复 使用道具 举报
黄晓波 发表于 2013-4-26 17:10

你的方法看懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马