access 删除字符串中的字符_统计字符串中每个字符出现的次数

    今天是js基础的最后一天。晚自习做的测试。

    关于这次测试感觉蛮可惜的,至少错一道题,多则四五道。

65e52377cdf22b1fa2e8b9d90c86415d.png

    这一道题选择C,因为C是显性类型转换。

其余选项,

A、字符串拼接—Number转字符串。    

B、字符串转Number。

D、任意类型转换成布尔型

    其他的题今天不说,如果真的有错的我会无能狂怒一会儿。


    今天的主角是一道大题,不说有多难,但是很巧妙。

题目如下:

统计字符串 'abcoefoxyozzopp' 中每个字符出现的次数。

    先说我写的方法:

 var str = 'abcoefoxyozzopp';    var arr = [];    var num = 0;    // 计数器    // 将字符串转换成数组    for (var i = 0; i         arr[i] = str.charAt(i);    }    // 数组排序        arr.sort();    // 见后文     for (var i = 0; i          if (arr[i] != arr[i + 1]) {         document.write(arr[i] + ":" + ++num + "个" + "
");         num = 0;      }else {          num++;                                   }}

    首先我要说这并不是一个很聪明的办法。不过,用的知识点相对较少,逻辑方面也比较好理解。

    先来说一下思路:

    1、将字符串排序,排序方法用的是转换成数组,然后用数组的内置排序方法Array.sort();

    2、排序过后重复的代码就会‘扎堆’出现在一起,这是我们只需要对比前后两个字符是否相同,如果相同就让计数器加1,如果不同就返回计数器的数。(可以参考一下斐波那契函数的思考方式)

    转换数组我用了一个相对愚蠢的方法——字符串指定‘索引’获取值+for循环。相比较有一个更好的方法是使用字符串自带的转数组方法:String.split()。

注意:这里的参数写空字符串“”,否则会返回一个整体。

    之后的代码就很好理解了,但是仍然要提示一点的是,计数器num是一个全局变量。因为每一次for循环都可能改变计数器的值,所以在计算完一个字符并输出之后一定要记着将计数器归零。


    还有一个很不错的想法,同样是比较好理解的。

var str = 'abcoefoxyozzopp';//循环的套出每个字符出现的次数 str会慢慢的变短直到为空while (str != "") {  //字符串转数组  var arr = str.split("");  var num = 0;  //求第一个字符出现的次数  for (var i = 0; i < arr.length; i++) {     if (arr[0] == arr[i]) {         num++;     }   }   //在字符串中删掉跟第一个字符一样的所有字符   var re = arr[0];   str = str.replace(re, "");   document.write(arr[0] + ":" + num + "个" + "
");   }

    这一方法的难度是在于想到这一方法。一旦有了思路代码就脱口而出了。

    思路:

    我们只需要专心统计每一个值,统计完之后删除即可。最后我们会把所有的字符全部删掉,当字符串为空时结束循环。

    需要说明一下,删除数组元素的方法有很多,我选择了一个相对比较简单的——数组元素替换(String.replace(x,y);).其他方式都可以,今天也学了很多,自己可以玩一玩,不一一举例了。

    如果发现这一步很难进行下去可以选择性的放弃。不过有w3cschool,菜鸟教程,MDN,我相信问题应该不大。


    最后一个也是我想着重说的一个,需要一定的编程思想,不过这个‘一定’也只是一丢丢。

var str = 'abcoefoxyozzopp';var obj = {};var i = 0;for (i = 0; i < str.length; i++) {  key = str[i];  if (obj[key]) {     //对象中有这个字母     obj[key]++;   }else {     //对象中没有这个字母,把字母加到对象中      obj[key] = 1;   }}//遍历这个对象 for (var key in obj){  document.write(key + ":" + obj[key] + "个" + "
");}

    使用这个方法是最"标准"的,通过键值对的方式输出字符串中出现的字符和字符的个数。

    我们把键当做字符,value当做计数器。

值得注意的有两点:

    1、声明变量的时候不要赋值undefined。第一篇关于JS的笔记就说了,undefined有自身的含义,所以永远不要显性将对象设置为undefined

    2、第一步判断 if (obj[key]) {},如果obj[key]没有初始化的话,值为undefined,undefined转换为布尔型是flase,此时向value中添加计时器。

    使用这种方法我们不用将字符串变成数组,因为我们只需要遍历字符串即可,不需要做任何修改。而字符串是可以通过‘索性’遍历的。

    为了安慰同桌小姐姐说这个方法不太重要,实际上自己都觉得有点些违心e6e4272d58a90403a6270dc16ec33e12.png。不过没关系,我们才学到基础。API也是基础。学到高级再理解这几行代码应该就so easy了b5aa885f755b98875b10e5c6c49fa850.png

补充一点:

    如果我们可以想到这种思路,那对于这种方法我们可以将其简写成:

for (var i = 0, l = str.length; i < l; i++) {  obj[str[i]] = (obj[str[i]] + 1) || 1;}

    没错就是短路运算(第一篇笔记中也有写过)。


最后的废话。

    又一次分别,这次是博哥。物是人非事事休,欲语泪先流。

    明天是老狗,狗哥,MC HotDog,我是差不多先生~

    API,DOM真的很重要!

    这次也许真的会掉头发!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值