私の友人のシャオ・ワンと私は二人とも「減量フィットネスクラブ」のメンバーです。
シャオ・ワンは、毎月この日にメンバー全員の体重リストが発表されるのですが、例外なくいつも一番太っているので、最近いつも心配そうな顔をしています。
私もそのリストの一部だったので、彼にこう言いました。「心配しないで、友よ、リストの順序を変えるのを手伝ってあげるよ。」
考えて、この順序で並べた方が良いのではないかと思いました。各体重の数字は、各桁の合計に従って小さいものから大きいものへと配置されます。
たとえば、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 のように、2 つの数値が同じ重みを持つ場合、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 Fun question: Weight Loss Club の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (m.sbmmt.com) をご覧ください。