首页 > 面试题:用js实现读取出字符串中每个字符重复出现的次数?

面试题:用js实现读取出字符串中每个字符重复出现的次数?

如字符串arr="abcdaabc",请用js读取出arr字符串中每个字母重复出现的次数分别是多少?


const arr="abcdaabc";
let counter = {};
for (let i = 0, len = arr.length; i < len; i++ ) {
    counter[arr[i]] ? counter[arr[i]]++ : counter[arr[i]] = 1;
}
console.log(counter);

不是最简洁的,期待更好的答案。


function getShowTimes(string,indexChar){

            //返回一个字符在字符串中出现的次数
            return (string.split(indexChar).length-1);
   }

  

大家的方法都大同小异,期待见到更好的想法 =v=

var str = 'abcdacbacxjkl';

var Counter = new Counter();

Counter.count(str); 

console.log(Counter.getResult()); //{a: 3, b: 2, c: 3, d: 1, x: 1…}


function Counter() {
    var temp = {};

    var push = function(item) {
        temp[item] = temp[item] ? ++temp[item] : 1;
    }

    this.count = function(str) {
        str.split('').forEach( function(item) {
            push(item);
        });
    }

    this.getResult = function() {
        return temp;
    }
}

var str = "aaaabbbccccddfgh";
var o={};
for(var i=0;i<str.length;i++){
    var key = str.charAt(i);
    if(o[key] && o[key].value==key) {
        o[key].count+=1;
    }
    else{
        o[key]={};
        o[key].value=key;
        o[key].count=1;
    }
};
for(key in o){
    console.log(o[key].value+'='+o[key].count);
};

var str  = "addbsnjfsss";
var strArray = str.split("");
var returnObj = {};
for(var i = 0; i < strArray.length; i++) {
    if(returnObj[strArray[i]]) {
        returnObj[strArray[i]] = parseInt(returnObj[strArray[i]]) + 1;
    } else {
        returnObj[strArray[i]] = 1;
    }
}
for(var p in returnObj) {
    console.log(p + " : " + returnObj[p]);
}

_.countBy('qwertqw  eqwq'.replace(/\s+/g,"").split(""), function(str) {
  return str;
});

@leftstick 的方案无可挑剔,但有些花哨了,对理解基本的原理不是最佳选择

那我就把它翻译成 plain js 吧

function charStats(str) {
    var visitStats = {};
    
    for (var i = 0; i < str.length; i++) {
        var char = str[i];
        if (!visitStats[char]++)
            visitStats[char] = 1;
    }
    
    return visitStats;
}

console.log(charStats('abcdaabc')); // {a: 3, b: 2, c: 2, d: 1}

用这一串测试一下吧:

a̋b̋c̋d̋a̋a̋b̋c̋


    var str = "aabbccf";
    
    var arr = str.split("");
    
    var count = {}; 
    arr.forEach(function(i) { 
        count[i] = (count[i]||0)+1;  
    });
    
    console.log(count);        
    

来一个效率更高的二叉树

var str='sadzewrwewasdfaxzvzxfasdaswe';

function count(s, e)
{
    if(s>e)
    {
        return {};
    }
    else if(s==e)    
    {
        var x=str.charAt(s);
        
        var json={};
        
        json[x]=1;
        
        return json;
    }
    
    var c=Math.floor((s+e)/2);
    
    
    var l=count(s, c);        
    var r=count(c+1, e);    
    
    
    var result=l;
    
    for(var i in r)
    {
        
        
        if(result[i])    
        {
            result[i]+=r[i];
        }
        else            
        {
            result[i]=r[i];
        }
    }
    
    return result;
}

console.log(count(0, str.length-1));

坐等更好方案:

var arr = 'abcdaabc';

var info = arr
    .split('')
    .reduce((p, k) => (p[k]++ || (p[k] = 1), p), {});

console.log(info); //{ a: 3, b: 2, c: 2, d: 1 }

var obj = {}
'abcdaabc efgh'.replace(/(\w)/g,function(word,p){
    obj[p[0]] ? obj[p[0]]+=1 : obj[p[0]] =1 
})
console.log(obj)

var arr = 'absdakbsabdabsab';
var _ss = arr.split('');
var _aa = [];
_ss.map(function(e){
    var _find = findChar(e);
    if(_find !== -1) _aa[_find].num++;
    else _aa.push({code:e,num:1});
})

function findChar(c){
    return _aa.findIndex(function(ele,index){
        if(ele.code === c) return true;
    })
}

findIndexE6规范


reduce不兼容低版本哦,还有比这个更简洁的吗?

    var temp = {};
   'abcdaabc'.replace(/(\w{1})/g,function($1){
        temp[$1] ? temp[$1]+=1 : temp[$1] = 1;
    })
    console.log(temp) // {a: 3, b: 2, c: 2, d: 1}

var arr="abcdaabc"
var count = {};
var i,k

for(i=0;i<arr.length;i++){
    var chr = arr.charAt(i);
    if( typeof count[chr] === "undefined"){
        count[chr] = 1;
    }else{
        count[chr]++;
    }
}
console.log(count)
for(k in count){
    if(count.hasOwnProperty(k)){
        console.log("%s:%d",k,count[k]);
    }
}

在字符串的前提条件下,对字符进行排序,使用字符串的lastIndexOf或数组的lastIndexOf方法是一个思路,可以减少查询次数。

var str = "aasdkfjwoensweljoipwefslnvxcvasfs";

str = str.split('').sort().join('');

var result = {}

for(var i = 0, j = str.length; i < j; i++){
    var char = str[i];
    result[char] = str.lastIndexOf(char) - i + 1;
    i = str.lastIndexOf(char)
}

console.table(result);

另外:

var str = "aasdkfjwoensweljoipwefslnvxcvasfs";

str = str.split('').sort().join('');

var arr = str.match(/(\w)\1+/g);

var result = {}

for(var i = 0, j = arr.length; i < j; i++){
    var item = arr[i];
    result[item.charAt(0)] = item.length;
}

console.table(result);

难道就没有一个用replace的?

function getSameWordCount(str) {
    var count = {};
    if (typeof str !== 'string') {
        return count;
    }
    while (str) {
        var originCount = str.length;
        var char = str.charAt(0);
        var charCount = (str = str.replace(new RegExp(char, 'g'), '')).length;
        count[char] = originCount - charCount;
    }
    return count;
}

var str = 'abcdaabc';
var result = {};
str.split('').forEach(function (char) {
    var val = result[char];
    result[char] = val ? ++val : 1;
}); 
console.log(result);

            var str="dfjkfkhsdjk hksjh",
                i=0,
                obj={};
            for(i=0;i<str.length;i++) {
                var ch=str.charAt(i);                    
                if (!obj[ch]) {
                    obj[ch]=1;
                } else{
                    obj[ch]++;
                }    
            }
            for(var r in obj)
            {
                console.log(r+","+obj[r]);
            }

var obj = {};
'abcdaabc'.split('').sort().join('').replace(/(.)(\1+)?/g, function(m,k){obj[k] = m.length});

console.log(obj); // {a: 3, b: 2, c: 2, d: 1}

不是最优,只是提供另一个思路,兼容所有浏览器。

【热门文章】
【热门文章】