根据字符串字符的个数排序输出

题目描述

如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。

实现以下接口:
    输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
    按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出
    清空目前的统计结果,重新统计
调用者会保证:
输入的字符串以‘\0’结尾。

输入描述:

输入一串字符。

输出描述:

对字符中的
各个英文字符(大小写分开统计),数字,空格进行统计,并按照统计个数由多到少输出,如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。

解题思路

(1)创建新对象,遍历字符串,将字符串的字符作为对象的属性值,并且将字符作为字符对象,赋予value和count属性

(2)将对象转化为字符对象数组,调用数组的sort方法进行排序,首先排序依据count值,当count值相同时依据value值的ascii码

(3)将排好序的字符对象数组的value值拼接成字符串输出。

//利用对象的属性和比较来做的
function charCnt(str){
    var obj = {};
    //创建字符对象
    for(var i=0 ; i<str.length; i++){
        var char = str.charAt(i);
        if(obj[char] && obj[char].value == char){
            ++obj[char].count;
        }else{
            obj[char] = {};
            obj[char].value = char;
            obj[char].count = 1;
        }
    }
    // console.log(obj);
    // 转化为字符对象数组
    var arr = [];
    for(var k in obj){
        arr.push(obj[k]);
    }
    
    //属性值比较,先比较字符次数,次数相同比较ASCII码
    var arr2 = arr.sort(function(obj1,obj2){
        if(obj1.count < obj2.count){
            return 1;
        }else if(obj1.count > obj2.count){
            return -1;
        }else{
            return (obj1.value).charCodeAt() - (obj2.value).charCodeAt();
        }
    });
    var result = '';
    for(var j=0; j<arr2.length; j++){
        result += arr2[j].value;
    }
    return result;
}
console.log(charCnt('8v26ktzk069lm400061m0v965we88850o6omqi532ktir6esb55t0kqm026y8rk63aj82kcx48gd1tiylvs0xo32zem65q7z5ce2185d2ascz62a2p3ajr45h637t2p290lc043gicp5ldzzmx2'));  //206583kmzct4aeil19dopqrsvx7gjybhw

 

链接:https://www.nowcoder.com/questionTerminal/c1f9561de1e240099bdb904765da9ad0
来源:牛客网

posted @ 2017-08-30 14:56  gq_orange  阅读(1481)  评论(0编辑  收藏  举报