저와 친구 Xiao Wang은 둘 다 '체중 감량 피트니스 클럽' 회원입니다.
최근 샤오왕은 늘 걱정스러운 표정을 짓고 있다. 매달 요즘 멤버 전원의 체중표가 공개되는데, 그는 예외 없이 항상 가장 뚱뚱하다.
저도 목록에 있었기 때문에 "친구여, 걱정하지 마세요. 목록 순서 변경을 도와드리겠습니다."라고 말했습니다.
생각해보니 다음 순서로 배열하는 것이 좋겠다는 생각이 들었습니다. 각 무게 숫자는 각 자릿수의 합에 따라 가장 작은 것부터 큰 것까지 배열되어 있습니다.
예를 들어 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 Fun Question: Weight Loss Club의 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!