codewarsテーマ記録
37350 ワード
1、問題の説明:二次元配列に入ってきました.「乗車人数、降車人数」、乗車人数が変動した後、車に残された総人数を計算します.
2、問題の説明:1つの配列の0を配列の末尾に移動し、他の要素は順序を保持します.
3、問題の説明:名前配列によって、対応する配列長の文字列を返します.
4、問題の説明:1つの配列を与え、数値は0または1であり、それを結合したバイナリを10進数に変換する.
5、問題の説明:テンプレートに従って数値配列を文字列にします.
6、問題の説明:文字列の文字をそれぞれ対応する数字で代用し、大文字と小文字を区別せず、文字列のアルファベットでない部分を無視する
まとめ:1)多くの場合、配列の反復方法で目的を達成できます.コードをより簡単で綺麗にします.すべてforサイクルではなく、必要な時に変数を宣言しますが、変数を多すぎないようにしてください.コードが煩雑になります.3)コードを書く過程で各変数の値に対して心の中で数え切ればいいです.変数の値が変わる時、私達は気づかなかったです.結果は予想と違っています.4)行列と文字列の様々な方法と両者の切り替えを熟練に把握する.
//
var number = function(busStops){
// Good Luck!
var len = busStops.length;
var num = 0;
for(var i = 0; i < len; i++){
num = num + busStops[i][0] - busStops[i][1];
}
return num;
}
//
const number = (busStops) => busStops.reduce((rem, [on, off]) => rem + on - off, 0);
注意点:1)第一のコードは最も考えやすく、最も一般的なコードですが、第二のフレキシブルな配列の反復方法Aray.reduce(Function)、reduce()方法は、配列の各要素に対して関数を実行し、値を返します.2)矢印関数(匿名関数):x => x * x
//
function (x) {
return x * x;
}
矢印関数には二つの書式があります.一つは上のように、一つの表現だけが含まれています.もう一つは複数の語句が含まれていますが、この場合は「…」と「return」を省略してはいけません.パラメータが一つ以上の場合は、括弧で囲みます.オブジェクトを返すには、単一表現であればエラーが発生します.// SyntaxError:
x => {
foo: x }
関数の「...」と文法的に衝突していますので、次のように変更します.// ok:
x => ({
foo: x })
矢印関数と匿名関数には明確な違いがあります.矢印関数内部のthisは語法作用領域であり、コンテキストによって決定され、カルル()またはappy()で矢印関数を呼び出した場合、thisをバインドできません.すなわち、着信する最初のパラメータは無視されます.2、問題の説明:1つの配列の0を配列の末尾に移動し、他の要素は順序を保持します.
//
var moveZeros = function (arr) {
var len = arr.length;
for (var i = 0; i < len; i++) {
if (arr[i] === 0) {
arr.splice(len, 0, arr[i]);
arr.splice(i, 1);
i--;
len--;
}
}
return arr;
}
//
var moveZeros = function (arr) {
return arr.filter(function(x) {
return x !== 0}).concat(arr.filter(function(x) {
return x === 0;}));
}
注意点:1)一つ目のコードは間違いやすいところがあります.よくlenを忘れます.このステップはコードが後ろに無限ループが発生する場合、ブラウザが崩壊します.二つ目のコードは巧みに配列の中を0としない部分を分割して、配列を結合します.2)Aray.filter()は、配列中の条件に合致する要素を絞り出し、配列を接続することができる.3、問題の説明:名前配列によって、対応する配列長の文字列を返します.
//
function likes(names) {
// TODO
var len = names.length;
var piece = " likes this";
var Piece = " like this";
var noone,First,Second,Third,num;
switch(len){
case 0:
noone = "no one";
noone += piece;
return noone;
case 1:
First = names[0];
First += piece;
return First;
case 2:
First = names[0];
Second = names[1];
First += " and " + Second + Piece;
return First;
case 3:
First = names[0];
Second = names[1];
Third = names[2];
First += ", " + Second + " and " + Third + Piece;
return First;
default:
First = names[0];
Second = names[1];
num = len - 2;
First += ", " + Second + " and " + num + " others" + Piece;
return First;
}
}
//
function likes(names) {
names = names || [];
switch(names.length){
case 0: return 'no one likes this'; break;
case 1: return names[0] + ' likes this'; break;
case 2: return names[0] + ' and ' + names[1] + ' like this'; break;
case 3: return names[0] + ', ' + names[1] + ' and ' + names[2] + ' like this'; break;
default: return names[0] + ', ' + names[1] + ' and ' + (names.length - 2) + ' others like this';
}
}
//
function likes (names) {
var templates = [
'no one likes this',
'{name} likes this',
'{name} and {name} like this',
'{name}, {name} and {name} like this',
'{name}, {name} and {n} others like this'
];
var idx = Math.min(names.length, 4);
return templates[idx].replace(/{name}|{n}/g, function (val) {
return val === '{name}' ? names.shift() : names.length;
});
}
注意点:1)第一のコードは、多すぎる変数を宣言しています.コードが煩雑すぎるように見えます.直接に宣言の変数を加算すると、第二のコードとなります.第三のコードはテンプレート文字列を採用しています.テンプレート文字列の中の「name」と「{n}にマッチします.もし{name}であれば、文字列配列の最初の要素を除去して返します.{n}残りの要素の個数を返します.4、問題の説明:1つの配列を与え、数値は0または1であり、それを結合したバイナリを10進数に変換する.
//
const binaryArrayToNumber = arr => {
// your code
var len = arr.length;
var num = 0;
for(var i = 0; i < len; i++){
num += arr[i] * Math.pow(2,len-1-i);
}
return num;
};
//
const binaryArrayToNumber = arr => parseInt(arr.join(''),2);
注意点:1)第一のコード思想は、それぞれ2の対応する二乗演算を行い、結果を加算します.第二のコードは配列を文字列に変換し、方法を使ってバイナリを10進数に変換します.5、問題の説明:テンプレートに従って数値配列を文字列にします.
//
function createPhoneNumber(numbers){
return "(" + numbers[0] + numbers[1] + numbers[2] + ")" + " " + numbers[3] + numbers[4] + numbers[5] + "-" + numbers[6] + numbers[7] + numbers[8] + numbers[9];
}
//
function createPhoneNumber(numbers){
numbers = numbers.join('');
return '(' + numbers.substring(0, 3) + ') '
+ numbers.substring(3, 6)
+ '-'
+ numbers.substring(6);
}
//
function createPhoneNumber(numbers){
var format = "(xxx) xxx-xxxx";
for(var i = 0; i < numbers.length; i++)
{
format = format.replace('x', numbers[i]);
}
return format;
}
//
function createPhoneNumber(numbers){
return numbers.join(‘‘).replace(/(...)(...)(.*)/, ‘($1) $2-$3‘);
}
第一のコードは簡潔明瞭であるが、配列要素が多いと、特に面倒で効率が悪い.第二のコードは配列を文字列に変換し、str.substring()を通じて文字列の中の文字を抽出し、第三のコードは文字列フォーマットを定義してから行を一つずつ置き換える.文字列の最初の3文字にそれぞれ対応して、中間の3文字と最後のすべての文字を置き換えます.6、問題の説明:文字列の文字をそれぞれ対応する数字で代用し、大文字と小文字を区別せず、文字列のアルファベットでない部分を無視する
//
function alphabetPosition(text) {
var t = text.split("");
for (var i = 0; i < t.length; i++) {
var x = t[i].charCodeAt();
if ((x >= 65 && x <= 90) || (x >= 97 && x <= 122)) {
t[i] = (x >= 97 ? x - 96 : x - 64).toString();
} else {
t.splice(i--, 1);
}
}
text = t.join(" ");
return text;
}
//
function alphabetPosition(text) {
return text
.toUpperCase()
.match(/[a-z]/gi)
.map( (c) => c.charCodeAt() - 64)
.join(' ');
}
注意点:1)第一の方法は従来の解法で、第二の方法は文字列をすべて大文字に変換し、アルファベットを対応数値に変換して文字列にし、配列と文字列の変換と対応方法によって解いています.まとめ:1)多くの場合、配列の反復方法で目的を達成できます.コードをより簡単で綺麗にします.すべてforサイクルではなく、必要な時に変数を宣言しますが、変数を多すぎないようにしてください.コードが煩雑になります.3)コードを書く過程で各変数の値に対して心の中で数え切ればいいです.変数の値が変わる時、私達は気づかなかったです.結果は予想と違っています.4)行列と文字列の様々な方法と両者の切り替えを熟練に把握する.