入力値としてnumber[]型
のような配列やstring型が与えられた場合を想定した問題についていくつか紹介します。
解答例ですが、次の2つのパターンの解答を順に提示します。
- for文とif文のみで構成された解答(use_for_if.tsx)
- 配列のメソッドを用いた解答(use_arr_method.tsx)
問題:配列の要素を2倍(返り値は number[])
use_for_if.tsx
export const doubleElements = (arr: number[]): number[] => {
const result: number[] = [];
for (let i = 0; i < arr.length; i++) {
result[i] = arr[i] * 2;
}
return result;
};
map関数を使うとより簡潔に書けます。
use_arr_method.tsx
export const doubleElements = (arr: number[]): number[] => {
return arr.map(num => num * 2);
};
問題:配列の合計(返り値は number)
use_for_if.tsx
export const sumArray = (arr: number[]): number => {
let sum = 0;
for (let i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
};
reduce関数を使うとより簡潔に書けます。
なお、reduce(減少する)と呼ばれるのは、「配列の要素すべてを集約して"1つの値"にまとめる」という意味とのことです。
use_arr_method.tsx
export const sumArray = (arr: number[]): number => {
return arr.reduce((sum, num) => sum + num, 0);
};
問題:偶数のみを抽出(返り値は number[])
use_for_if.tsx
export const filterEven = (arr: number[]): number[] => {
const result: number[] = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] % 2 === 0) {
result[result.length] = arr[i]; // pushを使わずに代入
}
}
return result;
};
filter関数を使うことでより簡潔に書けます。
use_arr_method.tsx
export const filterEven = (arr: number[]): number[] => {
return arr.filter(num => num % 2 === 0);
};
問題:文字列の反転(string型を string に変更)
use_for_if.tsx
export const reverseString = (str: string): string => {
let reversed = '';
for (let i = str.length - 1; i >= 0; i--) {
reversed += str[i];
}
return reversed;
};
補足ですが、TypeScriptにおいてstring型は配列のように扱えるオブジェクトとのことです。
splitメソッドとreverseメソッド、joinメソッドを組み合わせることでより簡潔に記述できます。
use_arr_method.tsx
export const reverseString = (str: string): string => {
return str.split('').reverse().join('');
};
変換過程は以下のイメージです。
"hello" // str
→ ["h", "e", "l", "l", "o"] // str.split('')
→ ["o", "l", "l", "e", "h"] // str.split('').reverse()
→ "olleh" // str.split('').reverse().join('')
問題:最大値の取得(返り値は number)
use_for_if.tsx
export const getMax = (arr: number[]): number => {
if (arr.length === 0) throw new Error("Empty array");
let max = arr[0];
for (let i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
};
use_arr_method.tsx
export const getMax = (arr: number[]): number => {
return Math.max(...arr);
};
問題:母音のカウント(arr の型を string に変更、返り値は number)
use_for_if.tsx
export const countVowels = (str: string): number => {
const vowels = ['a', 'i', 'u', 'e', 'o'];
let count = 0;
for (let i = 0; i < str.length; i++) {
const c = str[i].toLowerCase();
for (let j = 0; j < vowels.length; j++) {
if (c === vowels[j]) {
count++;
break;
}
}
}
return count;
};
use_arr_method.tsx
export const countVowels = (str: string): number => {
const vowels = ['a', 'i', 'u', 'e', 'o'];
return str
.toLowerCase()
.split('')
.filter(char => vowels.includes(char)).length;
};
問題:奇数だけを取り出す
use_for_if.tsx
export const filterOddNumbers = (arr: number[]): number[] => {
const result: number[] = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] % 2 !== 0) {
result[result.length] = arr[i]; // push 代替
}
}
return result;
};
use_arr_method.tsx
export const filterOddNumbers = (arr: number[]): number[] => {
return arr.filter(num => num % 2 !== 0);
};
問題:すべての要素を3乗にする
use_for_if.tsx
export const cubeElements = (arr: number[]): number[] => {
const result: number[] = [];
for (let i = 0; i < arr.length; i++) {
result[result.length] = arr[i] * arr[i] * arr[i]; // 三乗
}
return result;
};
use_arr_method.tsx
export const cubeElements = (arr: number[]): number[] => {
return arr.map(num => num * num * num);
};
問題:偶数の個数を数える
use_for_if.tsx
export const countEvenNumbers = (arr: number[]): number => {
let count = 0;
for (let i = 0; i < arr.length; i++) {
if (arr[i] % 2 === 0) {
count++;
}
}
return count;
};
use_arr_method.tsx
export const countEvenNumbers = (arr: number[]): number => {
return arr.reduce((count, num) => {
return num % 2 === 0 ? count + 1 : count;
}, 0);
};
問題:特定の文字の出現回数を数える(大文字小文字を区別しない)
use_for_if.tsx
export const countCharOccurrences = (str: string, target: string): number => {
let count = 0;
const lowerStr = str.toLowerCase();
const lowerTarget = target.toLowerCase();
for (let i = 0; i < lowerStr.length; i++) {
if (lowerStr[i] === lowerTarget) {
count++;
}
}
return count;
};
use_arr_method.tsx
export const countCharOccurrences = (str: string, target: string): number => {
const lowerTarget = target.toLowerCase();
return str
.toLowerCase()
.split('')
.filter(c => c === lowerTarget)
.length;
};
問題:配列を逆順に並べる
use_for_if.tsx
export const reverseArray = (arr: number[]): number[] => {
const result: number[] = [];
for (let i = arr.length - 1; i >= 0; i--) {
result[result.length] = arr[i];
}
return result;
};
use_arr_method.tsx
export const reverseArray = (arr: number[]): number[] => {
return arr.slice().reverse(); // 元の配列を変更しない
};
問題:数値を要素に持つ配列を昇順に並び替える(いわゆるバブルソート)
use_for_if.tsx
function bubbleSortAscending(nums: number[]): number[] {
const arr = nums.slice(); // 元配列を壊さないようコピー
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
const temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
use_arr_method.tsx
function sortNumericAscending(nums: number[]): number[] {
return nums.slice().sort((a, b) => a - b);
}
補足:
.sort((a, b) => a - b)のa, bはそれぞれ、各要素の前後を表しています。a-b > 0だった場合(前方の数値の方が大きかった場合)、aとbが入れ替わり大きい方の値が後方に移動します。
なお、.sort()と書いた場合は、文字列として昇順に並び替えられます。