From b898a00a221e6b69f5dff131ecc45206de3bb88c Mon Sep 17 00:00:00 2001 From: alex_p Date: Mon, 31 Oct 2022 22:03:40 +0300 Subject: [PATCH 1/2] algorithm: add PercentageOfLetters algo and a test for it --- String/PercentageOfLetters.js | 28 +++++++++++++++++++++++++ String/test/PercentageOfLetters.test.js | 16 ++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 String/PercentageOfLetters.js create mode 100644 String/test/PercentageOfLetters.test.js diff --git a/String/PercentageOfLetters.js b/String/PercentageOfLetters.js new file mode 100644 index 0000000000..a22a7ae08e --- /dev/null +++ b/String/PercentageOfLetters.js @@ -0,0 +1,28 @@ +/** + * @function percentageOfLetter + * @description Return the percentage of characters in 'str' + * that equal 'letter' rounded down to the nearest whole percent. + * More info: https://leetcode.com/problems/percentage-of-letter-in-string/ + * @param {String} str + * @param {String} letter + * @returns {Number} + * @example + * const str = 'foobar', const letter = 'o' + * percentageOfLetter(str, letter) // ===> 33 + */ +const percentageOfLetter = (str, letter) => { + if (typeof str !== 'string' || typeof letter !== 'string') { + throw new Error('Input data must be strings') + } + let letterCount = 0 + // Iterate through the whole given text + for (let i = 0; i < str.length; i++) { + // Count how often the letter appears in the word + letterCount = str[i].toLowerCase() === letter.toLowerCase() ? letterCount + 1 : letterCount + 0 + } + const percentage = Math.floor((100 * letterCount) / str.length) + + return percentage +} + +export { percentageOfLetter } diff --git a/String/test/PercentageOfLetters.test.js b/String/test/PercentageOfLetters.test.js new file mode 100644 index 0000000000..7a58dd0ecc --- /dev/null +++ b/String/test/PercentageOfLetters.test.js @@ -0,0 +1,16 @@ +import { percentageOfLetter } from '../PercentageOfLetters' + +describe('Percentage of Letters in a String', () => { + test('Calculate percent for lower case', () => { + expect(percentageOfLetter('foobar', 'o')).toEqual(33) + expect(percentageOfLetter('aaabcd', 'a')).toEqual(50) + }) + test('Calculate percent for upper case', () => { + expect(percentageOfLetter('foobar', 'o')).toEqual(33) + expect(percentageOfLetter('aAabcd', 'a')).toEqual(50) + }) + test('Throwing an exception', () => { + expect(() => percentageOfLetter(100, 'string')).toThrow() + expect(() => percentageOfLetter('string', true)).toThrow() + }) +}) From 06992e0021eaa4595b7be330254e07dfd6b4ee35 Mon Sep 17 00:00:00 2001 From: alex_p Date: Mon, 31 Oct 2022 22:41:15 +0300 Subject: [PATCH 2/2] refactor: remove empty line --- String/PercentageOfLetters.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/String/PercentageOfLetters.js b/String/PercentageOfLetters.js index a22a7ae08e..fbd6a03be3 100644 --- a/String/PercentageOfLetters.js +++ b/String/PercentageOfLetters.js @@ -18,10 +18,9 @@ const percentageOfLetter = (str, letter) => { // Iterate through the whole given text for (let i = 0; i < str.length; i++) { // Count how often the letter appears in the word - letterCount = str[i].toLowerCase() === letter.toLowerCase() ? letterCount + 1 : letterCount + 0 + letterCount += str[i].toLowerCase() === letter.toLowerCase() ? 1 : 0 } const percentage = Math.floor((100 * letterCount) / str.length) - return percentage }