Home > Web Front-end > JS Tutorial > JavaScript Fun Question: Weight Loss Club

JavaScript Fun Question: Weight Loss Club

黄舟
Release: 2017-02-04 15:24:24
Original
1151 people have browsed it

My friend Xiao Wang and I are both members of the "Weight Loss Fitness Club".

Xiao Wang always looks worried recently, because a weight list of all members is released on these days every month, and he is always the fattest without exception.

I was also part of the list, so I told him: "Don't worry, my friend, I will help you change the order of the list."

I thought about it and thought it would be better to arrange it in this order: each weight number is arranged according to the sum of each digit, from small to large.

For example, 99kg, the sum of its digits is 18, which means the "weight" is 18.

For another example, 100kg has a weight of 1, so it ranks before 99kg.

The task is this:

Given a string of weight loss club member lists, can you sort it by weight and return it?

Example:

"56 65 74 100 99 68 86 180 90"  => "100 180 90 56 65 74 68 86 99"
Copy after login

When two numbers have the same weight, such as 180 and 90, then 180 comes first, and we follow dictionary order.


All numbers are positive, the list may be empty.

To be honest, when I saw this topic, I was a little sweaty~ After all, I am also a fat man.

It’s obviously not convenient to directly operate strings, so let’s break them into arrays!

Then sort the array, the rules are as follows:

1. Weight is given priority, the smaller the weight, the higher the ranking.

2. When the weights are the same, arrange them in dictionary order.

To calculate the weight, that is, to calculate the sum of each digit, you need this method:

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

Then, to compare the lexicographic order, you need this method:

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++;  
    }  
}
Copy after login

In fact, this method There is an alternative method in native JS:

String.prototype.localeCompare
Copy after login

This defaults to dictionary order.


Finally, just integrate, sort, and aggregate into strings.

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(" ");  
}
Copy after login

The above is the content of JavaScript Fun Questions: Weight Loss Club. For more related content, please pay attention to the PHP Chinese website (www.php.cn)!


Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template