diff --git a/String/MaxCharacter.js b/String/MaxCharacter.js index b7741f3395..98bb57cecf 100644 --- a/String/MaxCharacter.js +++ b/String/MaxCharacter.js @@ -1,29 +1,36 @@ -/* - Given a string of characters, return the character that appears the most often. - Example: input = "Hello World!" return "l" -*/ -const maxCharacter = (value) => { - if (typeof value !== 'string') { - throw new TypeError('The param should be a string') - } else if (!value) { - throw new Error('The param should be a valid string') +/** + * @function maxCharacter + * @example - Given a string of characters, return the character that appears the most often. Example: input = "Hello World!" return "l" + * @param {string} str + * @param {RegExp} ignorePattern - ignore the char in str that is not required + * @returns {string} - char + */ +const maxCharacter = (str, ignorePattern) => { // initially it's count only alphabets + if (typeof str !== 'string') { + throw new TypeError('Argument should be a string') + } else if (!str) { + throw new Error('The param should be a nonempty string') } - const occurrences = {} - for (let i = 0; i < value.length; i++) { - const char = value[i] - if (/\s/.test(char)) continue - occurrences[char] = occurrences[char] + 1 || 1 + // store all char in occurrence map + const occurrenceMap = new Map() + + for (const char of str) { + if (!ignorePattern?.test(char)) { + occurrenceMap.set(char, occurrenceMap.get(char) + 1 || 1) + } } - let maxCharacter = null - let maxCount = 0 - Object.keys(occurrences).forEach(char => { - if (occurrences[char] > maxCount) { - maxCount = occurrences[char] - maxCharacter = char + + // find the max char from the occurrence map + let max = { char: '', occur: -Infinity } + + for (const [char, occur] of occurrenceMap) { + if (occur > max.occur) { + max = { char, occur } } - }) - return maxCharacter + } + + return max.char } -export { maxCharacter } +export default maxCharacter diff --git a/String/test/MaxCharacter.test.js b/String/test/MaxCharacter.test.js index 6fd419ec30..3de3029e15 100644 --- a/String/test/MaxCharacter.test.js +++ b/String/test/MaxCharacter.test.js @@ -1,12 +1,21 @@ -import { maxCharacter } from '../MaxCharacter' +import maxCharacter from '../MaxCharacter' describe('Testing the maxCharacter function', () => { it('Expect throw with wrong arg', () => { expect(() => maxCharacter(123)).toThrow() + expect(() => maxCharacter('')).toThrow() }) + it('Check the max character in string', () => { const theString = 'I can\'t do that' - const maxChar = maxCharacter(theString) + const maxCharInAllCount = maxCharacter(theString) + const maxChar = maxCharacter(theString, /\s/) + + expect(maxCharInAllCount).toBe(' ') expect(maxChar).toBe('t') + + expect(maxCharacter('!!!Hello, World!!!', /[a-z]/)).toBe('!') + + expect(maxCharacter('!!!Hello, World!!!', /[^a-z]/i)).toBe('l') }) })
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: