频道栏目
首页 > 程序开发 > 软件开发 > Java > 正文
JavaScript趣题:减肥俱乐部
2016-09-18 09:18:00           
收藏   我要投稿

我和朋友小王都是“减肥健身俱乐部”的成员。

小王最近总是忧心忡忡的样子,因为每月这几天都会发布一个所有成员的体重名单,而他每次都无一例外是最胖的。

我也是拟定名单的一份子,于是我告诉他:“别担心,我的朋友,我来帮你改下列表的顺序”。

我前思后想,觉得还是按这样的顺序来排为好:每个体重数字,按各个数位数字之和,从小到大排列。

比如说,99kg,它的各个数位数字之和是18,也就是说“权重”为18。

再比如,100kg,它的权重是1,所以排在99kg之前。

任务是这样:

给定减肥俱乐部成员名单字符串,你能按权重给它排序并返回嘛?

例子:

 

"56 65 74 100 99 68 86 180 90"  => "100 180 90 56 65 74 68 86 99"
当两个数字拥有同样的权重,如180和90,则180在前,此时我们按照字典序来。

 

所有数字都为正,列表可能为空。

说实话,看到这个题目,我也是有些汗~毕竟自己也是个胖子。

直接操作字符串显然不够方便,还是打散成数组吧!

接着对数组进行排序,规则如下:

1.权重优先,权重越小,排名越前。

2.当权重相同,再按照字典序排列。

计算权重,也就是计算各个数位数字之和,得需要这个方法:

 

function eachDigitSum(num){
    var sum = 0;
    num = num - 0;
    while(num > 0){
        sum += num % 10;
        num = parseInt(num / 10);
    }
    return sum;
}

接着,比较字典序,需要这个方法:

 

 

function compareASCII(a,b){
    var i=0;
    while(true){
        var c1 = a.charCodeAt(i);
        var c2 = b.charCodeAt(i);
        if(!c1){
            return -1;
        }
        if(!c2){
            return 1;
        }
        if(c1 < c2){
            return -1;
        }
        if(c1 > c2){
            return 1;
        }
        i++;
    }
}
其实这个方法在原生JS是有替代方法的:

 

String.prototype.localeCompare

这个默认就是按字典序。


最后,整合下排序,再聚合成字符串就可以了。

 

function orderWeight(str) {
    return str.split(" ").sort(function(a,b){
        var n1 = eachDigitSum(a);
        var n2 = eachDigitSum(b);
        if(n1 > n2){
            return 1;
        }
        else if(n1 < n2){
            return -1;
        }
        else{
            return compareASCII(a,b);
        }
    }).join(" ");
}
点击复制链接 与好友分享!回本站首页
上一篇:Spring4深入理解IOC&DI04----Bean配置方式(全类名,工厂方法,FactoryBean) 配置形式(基于XML和注解) 泛型依赖注入
下一篇:Java反射机制
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站