JavaScript趣题:减肥俱乐部
2016-09-16 19:14
260 查看
我和朋友小王都是“减肥健身俱乐部”的成员。
小王最近总是忧心忡忡的样子,因为每月这几天都会发布一个所有成员的体重名单,而他每次都无一例外是最胖的。
我也是拟定名单的一份子,于是我告诉他:“别担心,我的朋友,我来帮你改下列表的顺序”。
我前思后想,觉得还是按这样的顺序来排为好:每个体重数字,按各个数位数字之和,从小到大排列。
比如说,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(" ");
}
小王最近总是忧心忡忡的样子,因为每月这几天都会发布一个所有成员的体重名单,而他每次都无一例外是最胖的。
我也是拟定名单的一份子,于是我告诉他:“别担心,我的朋友,我来帮你改下列表的顺序”。
我前思后想,觉得还是按这样的顺序来排为好:每个体重数字,按各个数位数字之和,从小到大排列。
比如说,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(" ");
}
相关文章推荐
- JavaScript趣题:点、线、面
- JavaScript趣题:帮邮递员分类地址
- JavaScript趣题:深度比较对象
- JavaScript趣题:密码验证
- JavaScript趣题:统计降水量
- JavaScript趣题:创建电话号码
- JavaScript趣题:波浪形排序
- JavaScript趣题:斐波那契数列生成器
- JavaScript趣题:找出凶手
- JavaScript趣题:买车子
- JavaScript趣题:质数之差
- JavaScript趣题:分解质因数
- JavaScript趣题:全排列去重
- JavaScript动态减肥
- JavaScript趣题:弹力球
- JavaScript趣题:Jaden Smith
- JavaScript趣题:求解最大子数组之和
- JavaScript趣题:计算方差
- JavaScript趣题:链表的归并排序
- JavaScript趣题:成双成对的括弧