[js]找到 数组 出现最多的字母并给出个数和每一个所在的顺序。

找到数组["a","x","b","d","m","a","k","m","p","j","a"];出现最多的字母并给出个数和每一个所在的顺序

新手不太会,希望得思路提示或者代码

阅读 7.3k
5 个回答

1、统计次数,记录位置
2、找最大,输出

var arr   = ["a","x","b","d","m","a","k","m","p","j","a"];
    var count = {};
    var pos   = {};
    //遍历arr,统计每个字母出现次数且记录位置
    arr.forEach(function(value, index){
        if(count[value]){
            count[value] ++;
            pos[value] += ","+index; 
        } else {
            count[value] = 1;
            pos[value]   = ""+index;
        }
    });
    console.log(count);
    console.log(pos);
    
    //获取出现最多的字母
    var max = 0;
    var letter;
    for(i in count){
        if(count[i] > max ){
            max    = count[i];
            letter = i; 
        }
    }
    
    console.log("最多的是:" + letter);
    console.log("位置分布:" + pos[letter]);
var arr = ["a","x","b","d","m","a","k","m","p","j","a"];
var res = {};
arr.forEach(function(v,i){
      if(v in res){
            res[v] += 1;
        }else{
            res[v] = 1;
    } 
});
console.log(res);
var num = 0;
for (i in res){
 if(res[i] > num) {
    num = res[i];
}
}
  1. 搜集数组中的每个字符以及对应的位置信息,存储的格式如下
    对象的属性是数组的元素,而对象的值是一个数组,记录着位置的索引

    {
        'a':[0,5,10],
        'x':[1]
    }
  1. 获取出现次数最多的字符,以及对应的位置


function getMaxAndIndex( arr ){
        var obj = {};
        arr.forEach(function(item,index){
            if(!obj[item]){
                obj[item]= {indexs: [index]}
            }else{
                obj[item]['indexs'].push(index);
            }
        });
        var num=0;//记录出现次数最大值
        var str='';//记录出现次数最多的字符
        var reArr;//返回最大值的位置数组
        for(var attr in obj){
            var temp=obj[attr]['indexs'];
            if(temp.length>num){
                num=temp.length;
                str=attr;
                reArr=temp;
            }
        }
        return {
            maxStr:str,
            indexs:reArr
        }
    }

测试结果截图
图片描述

let arr = ["a","x","b","d","m","a","k","m","p","j","a"], t, o;
t = arr.reduce( (r, i) => { r[i] = (r[i] || 0) + 1; return r; }, {} );
o = Object.keys( t ).sort( (p, n) => t[n] - t[p] )[0];
console.log(o);

前面解决方案都存在BUG,如果有出现最多的字母有多个,就有会有问题,详细代码参考:

var arr = ['a', 'x', 'b', 'd', 'm', 'm', 'a', 'k', 'm', 'p', 'p', 'p', 'p', 'j', 'a', 'a'];
//计数
var count = {};
//索引
var pos = {};
//遍历原数组并且生成新数组
for (var i = 0; i < arr.length; i++) {
    var char = arr[i];
    if (count[char]) {
        count[char] += 1;
        pos[char] += ',' + i;
    } else {
        count[char] = 1;
        pos[char] = i;
    }
}
// console.log(count);
// console.log(pos);

//返回出现次数最多的字母的次数(降序排列后取第一个数字)
var max = count[Object.keys(count).sort(function(a, b) {
    return count[a] <= count[b];
})[0]];
// console.log(max);

//出现次数最多的字母如果有多个,全部写入arr_pu数组中,并输出
var arr_pu = [];

for (i in count) {
    if (count[i] >= max) {
        //将最大值给max
        max = count[i];
        //将出现最多的字母放到arr_pu数组中
        arr_pu.push(i);
        console.log(arr_pu)
    }
}
document.write('出现次数最多的字母是:' + arr_pu + '<br>');

//将出现最多的字母的次数输出
for (var i = 0; i < arr_pu.length; i++) {
    key = arr_pu[i];
    document.write(key + '出现的次数为:' + count[key] + '<br>');
    document.write(key + '的位置分别为:' + pos[key] + '<br>');
}
推荐问题