Different factorial of a number using javascript - javascript

I'm trying to come up with a function that gives me a "factorial" of a number but in a different way.
For example:
15! = 15*14/13+12-11*10/9... and so on.
I tried doing this by first creating an array and, then, a loop to get to the result. But it doesn't work as expected. The result expected from the code below is 13.
function createList(n) {
let input = n
let list = [input]
for(i = input-1; i >= 1; i--) {
list.push(i)
}
return list
}
function factorialDiff() {
let elements = createList(12)
var res = elements.shift()
while(elements.length >= 1) {
if(elements.length == 0) {
return res
}
res *= elements.shift()
if(elements.length == 0) {
return res
}
res /= elements.shift()
if(elements.length == 0) {
return res
}
res += elements.shift()
if(elements.length == 0) {
return res
}
res -= elements.shift()
if(elementos.length == 0) {
return res
}
}
return res
}
console.log(factorialDiff())
``
`

This is what your code is doing:
console.log(((((12*11)/10+9-8)*7/6+5-4)*3)/2+1);
In math the convention is to solve multiplication/division first and plus/minus second in this order. However, the code you did is solving the operations from left to right.
For example:
console.log(12*11/10+9-8*7/6+5-4*3/2+1); // returns 12.86
console.log(((((12*11)/10+9-8)*7/6+5-4)*3)/2+1); // returns 27.35 just like your function does
If your expected behavior is the first line, the following function should solve your problem:
function factorialDiff() {
const elements = createList(12);
let res1 = elements.shift();
let res2 = elements.shift();
let res3 = elements.shift();
let res = (res1*res2/res3)
while(elements.length >= 1) {
res += elements.shift();
if(elements.length == 0) {
return res;
}
res1 = elements.shift();
if(elements.length == 0) {
return res*res1;
}
res2 = elements.shift();
if(elements.length == 0) {
return res*res1/res2;
}
res3 = elements.shift();
res -= (res1*res2/res3);
if(elements.length == 0) {
return res;
}
}
return res;
}

Is this what you looking for?
function myFactorial(num) {
var result = num;
operatorNum = 0;
for(i = num - 1; i >= 1; i--){
if(operatorNum % 4 == 0){ // "*"
result = result * i;
}else if (operatorNum % 4 == 1){ // "/"
result = result / i;
}else if (operatorNum % 4 == 2){ // "+"
result = result + i;
}else{ // "-"
result = result - i;
}
operatorNum++;
}
return result;
}
console.log(myFactorial(4)); // logs 7

Related

JS Function works with individual arrays but misbehaves when trying to loop through an array of arrays

I am trying to solve a problem where I am required to loop through an array of arrays, each of which contains a list of numbers that together make up a credit card number. I've been asked to use the Luhn algorithm to validate these numbers, working from the rightmost number in each array to the leftmost. I came up with a function that successfully returns true or false for each array correctly (I know in advance that 5 are valid and 5 are false while a remaining 5 are not known). However, when I then try to loop through the array containing all these arrays, calling the function on them each in turn, the program hangs for ages and finally returns a long list of trues, far longer than the 15 results I expect. My code is below, validateCred seems to work for each card number individually, but findValidCards does not. I can't see why this is happening, can anyone enlighten me?
const validateCred = arr => {
const resultArray = [];
let index = (arr.length) - 1;
if ((index % 2) != 0) {
for (i = index; i >= 0; i--) {
if ((i % 2) == 0) {
let doubled = arr[i] * 2;
if (doubled > 9) {
let numToUnshift = doubled - 9;
resultArray.unshift(numToUnshift);
} else {
resultArray.unshift(doubled);
};
} else {
resultArray.unshift(arr[i]);
};
};
} else {
for (i = index; i >= 0; i--) {
if ((i % 2) != 0) {
let doubled = arr[i] * 2;
if (doubled > 9) {
let numToUnshift = doubled - 9;
resultArray.unshift(numToUnshift);
} else {
resultArray.unshift(doubled);
};
} else {
resultArray.unshift(arr[i]);
};
};
};
const reducer = (acc, curr) => acc + curr;
let sum = resultArray.reduce(reducer);
if ((sum % 10) == 0) {
return true;
} else {
return false;
};
}
const findInvalidCards = array => {
let resultArray = [];
for (i = 0; i < array.length; i++) {
let card = array[i];
let result = validateCred(card);
console.log(result);
};
};

NodeJS script running but logging nothing

so I am writing a function to get biggest divisor,
and I am running it in VScode using command
$ -node script.js
it is logging nothing, what am I missing?
here is the content of script.js :
let LFfinder = num => {
let result = num;
for (let i = num - 1; i > 1 && result === num; i--) {
if (num % i === 0) {
result = i;
return result;
}
if (!i) {
return result;
}
}
console.log(result);
};
LFfinder(15);
You are writing console.log() at the place where control is not reaching as per your logic. Try writing before you return the value
let LFfinder = num => {
let result = num;
for (let i = num - 1; i > 1 && result === num; i--) {
if (num % i === 0) {
result = i;
console.log(result);
return result;
}
if (!i) {
console.log(result);
return result;
}
}
};
LFfinder(15)
You don't need to return in the loop. Because of return the console.log statement is never reached. And the else part is not required. This will work:
let LFfinder = num => {
let result = num;
for (let i = num - 1; i > 1 && result === num; i--) {
if (num % i === 0) {
result = i;
break;
}
}
console.log(result);
};
LFfinder(15);
LFfinder(19);
LFfinder(200);
Note that you don't need to loop through till end. The first instance you find is the greatest, so save further iteration with break.
Also, it's better that the function returns a value instead of logging the answer.
let LFfinder = num => {
let result = num;
for (let i = num - 1; i > 1 && result === num; i--) {
if (num % i === 0) {
result = i;
break;
}
}
return result;
};
console.log(LFfinder(15));
console.log(LFfinder(19));
console.log(LFfinder(200));
its working fine, please check the link, i've tried
https://repl.it/#HarshSrivastav1/playgroundams

Reverse string without reversing special characters using Javascript

I am unable to find problem in this code. I want to reverse the string without reversing special characters. So, if the string is 'ab#$cd!' ,the output would be 'dc#$ba!' the output I am getting is 'ab#$cd!' (the same as input).
Kindly find the problem in the code.
function isAlphabet(x) {
if ((x >= 'A' && x <= 'Z') || (x >= 'a' && x <= 'z')) {
return true
} else {
return false
}
}
function reverse() {
var string1 = [];
string1 = 'ab#$cd!'
var n = string1.length;
var r = n - 1;
var i = 0;
while (i < r) {
if (!isAlphabet(string1[i])) {
i++;
} else if (!isAlphabet(string1[r])) {
r--;
} else {
var temp;
temp = string1[i];
string1[i] = string1[r];
string1[r] = temp;
i++;
r--;
}
}
return string1;
}
console.log(reverse());
You can't modify string in this way, strings are immutable in JavaScript
var str = "abcdef";
console.log(str[1])
str[1] = "x"
console.log(str)
Change your string to array, modify array and then join it:
var str = "abcdef", arr = str.split("");
console.log(arr[1])
arr[1] = "x"
console.log(arr.join(""))
Your example (consider renaming variables - I left original names):
function isAlphabet(x) {
if ((x >= 'A' && x <= 'Z') || (x >= 'a' && x <= 'z')) {
return true
} else {
return false
}
}
function reverse() {
var string1 = [];
string1 = 'ab#$cd!'.split("")
var n = string1.length;
var r = n - 1;
var i = 0;
while (i < r) {
if (!isAlphabet(string1[i])) {
i++;
} else if (!isAlphabet(string1[r])) {
r--;
} else {
var temp;
temp = string1[i];
string1[i] = string1[r];
string1[r] = temp;
i++;
r--;
}
}
return string1.join("");
}
console.log(reverse());
Here is a snippit that uses split(), pop(), push() & reverse() methods.
function reverseString(str){
var splitString, exclamationMark, reverseArray, joinArray;
splitString = str.split("");
exclamationMark = splitString.pop();
reverseArray = splitString.reverse();
reverseArray.push(exclamationMark);
joinArray = reverseArray.join("");
return joinArray;
}
console.log(reverseString("ab#$cd!"));
var str = "#hello$worl!d" var spclindx = []; var final = ''
var onlyalpha = str.match(/[a-z]|[A-Z]/g).reverse();
[...str].map((x, key) => { if (!x.match(/[a-z]/i)) { spclindx.push(key + '.' + x) } })
spclindx.map(y => { var sp = y.split('.'); console.log(sp) final = onlyalpha.splice(sp[0], 0, sp[1]) final = onlyalpha.join('') })
console.log(final)

Javascript getting the nth prime number

This should return the nth prime (n being the number given by the user). It works fine for the first few numbers (1 returns 2, 2 returns 3, 3 returns 5) but when 5 is given, it returns 9 which isn't prime (it should be 11). This happens with other numbers as well above this (7 returns 15 when it should be 17).
The 'document' stuff is to do with HTML where I'm getting the userValue and to display the prime number.
function isPrime(value) {
for(var i = 2; i < value; i++) {
if(value % i === 0) {
return false;
}
}
return value > 1;
}
function generatePrime() {
var userValue = document.getElementById("inputValue").value;
var iter = 1;
var returnValue = 2;
//checks for an integer
if (parseInt(userValue) === parseFloat(userValue)) {
//checks if the user inputted a value above 0
if (userValue > 0) {
//loops to find the correct prime
while (iter < userValue) {
if (isPrime(returnValue)) {
returnValue += 1;
iter += 1;
}
if (!isPrime(returnValue)) {
returnValue += 1;
}
}
}
else {
returnValue = "That is not a number above 0!";
}
}
else {
returnValue = "That is not a number!";
}
document.getElementById("returnValue").innerHTML = returnValue;
}
I need help with making this return the correct number.
Try this one.
function nextPrime(value) {
if (value > 2) {
var i, q;
do {
i = 3;
value += 2;
q = Math.floor(Math.sqrt(value));
while (i <= q && value % i) {
i += 2;
}
} while (i <= q);
return value;
}
return value === 2 ? 3 : 2;
}
function generatePrime() {
var userValue = document.getElementById("inputValue").value;
var value = 0, result = [];
for (var i = 0; i < userValue; i++) {
value = nextPrime(value);
result.push(value);
}
document.getElementById("returnValue").innerHTML = result[userValue-1];
}
<!DOCTYPE html>
<html>
<head>
<script>
</script>
</head>
<body>
Input value: <input type="text" name="inputValue" id="inputValue"/>
<button onclick="generatePrime()">Prime number</button>
<div id="returnValue">Test: </div>
</body>
</html>
You can try something like this:
function getNthPrimeNumber(n){
var count = 0;
var num = 2;
while(count++ != n){
num = getNextPrimeNumber(num);
}
return num;
}
function getNextPrimeNumber(n){
for(var i = ++n; i< n*n; i++){
if(isPrime(i)) return i
}
return 0;
}
function isPrime(n){
for(var i = 2; i< n; i++)
if (n%i===0)
return false;
return true;
}
console.log(getNthPrimeNumber(0))
console.log(getNthPrimeNumber(2))
console.log(getNthPrimeNumber(5))
You could reduce the range of iteration for function isPrime() :
function isPrime(value) {
for(var i = 2; i < Math.sqrt(value) + 1; i++) {
if(value % i === 0) {
return false;
}
}
return value > 1;
}
The following is based on Bhaskara Arani's submission, but I added caching.
Note: I also threw in an addition condition to check for palindrome.
This check can be removed via:
while (i <= root && value % i /* && isPalindrome(value) */)
const main = () => {
for (let i = 15; i >= 0; i--) {
console.log(`Palindrome Prime ${i + 1} = ${generatePrime(i)}`);
}
};
const cachedPrimes = [];
const generatePrime = (index) => {
let value = cachedPrimes[cachedPrimes.length - 1] ?? 0;
for (let i = cachedPrimes.length; i <= index; i++) {
value = nextPrime(value);
cachedPrimes.push(value);
}
return cachedPrimes[index];
};
const nextPrime = (value) => {
if (value > 2) {
let i, root;
do {
i = 3; value += 2; root = ~~Math.sqrt(value);
while (i <= root && value % i && isPalindrome(value)) {
i += 2;
}
} while (i <= root);
return value;
}
return value === 2 ? 3 : 2;
};
const isPalindrome = (n) => n === reverse(n);
const reverse = n => +`${n}`.split('').reverse().join('');
main();
.as-console-wrapper { top: 0; max-height: 100% !important; }

Finding the most frequent character in a string javascript

Assuming I have the following string "355385". I need a simple JavaScript that can tell me that the most mentioned character is 5. Thank you in advance.
I tried with this one but no results.
var exp = '355385' ;
var exps =exp.split("");
var expCounts = { };
for (var i=0;i<exp.length;i++)
{expCounts["_" + exps[i]] = (expCounts["_" + exps[i]] || 0) + 1 ;
if (expCounts==3) exps=exps[i]; }; exps;
This will loop over every character in the string and keep track of each character's count and the character with the maximum count:
var exp = '3553853335' ;
var expCounts = {};
var maxKey = '';
for(var i = 0; i < exp.length; i++)
{
var key = exp[i];
if(!expCounts[key]){
expCounts[key] = 0;
}
expCounts[key]++;
if(maxKey == '' || expCounts[key] > expCounts[maxKey]){
maxKey = key;
}
}
console.debug(maxKey + ":" + expCounts[maxKey]);
Update:
Here is an ES6 version that will handle strings where multiple character have the same max count
function maxCount(input) {
const {max, ...counts} = (input || "").split("").reduce(
(a, c) => {
a[c] = a[c] ? a[c] + 1 : 1;
a.max = a.max < a[c] ? a[c] : a.max;
return a;
},
{ max: 0 }
);
return Object.entries(counts).filter(([k, v]) => v === max);
}
Example (please excuse the crude output):
maxCount('--aaaa1111--').join(' | ').replace(/,/g, ':');
outputs 1:4 | -:4 | a:4
var getMax = function (str) {
var max = 0,
maxChar = '';
str.split('').forEach(function(char){
if(str.split(char).length > max) {
max = str.split(char).length;
maxChar = char;
}
});
return maxChar;
};
logs
getMax('355385') //5;
getMax('35538533') //3;
in equal case it will return first number
getMax('3553') //3;
var string = "355385",
counter = {};
for (var i = 0, len = string.length; i < len; i += 1) {
counter[string[i]] = (counter[string[i]] || 0) + 1;
}
var biggest = -1, number;
for (var key in counter) {
if (counter[key] > biggest) {
biggest = counter[key];
number = key;
}
}
console.log(number);
# 5
var exp = '355385';
var findMostFrequent = function (string) {
var chars = {}, first = string.charAt(0);
chars[first] = 1;
var maxChar = first, maxCount = 1;
for (var i = 1; i < string.length; i++) {
var char = string.charAt(i);
if (chars[char]) {
chars[char]++;
} else {
chars[char] = 1;
}
if (chars[char] > maxCount) {
maxChar = char;
}
}
return maxChar;
};
Another Solution
function maxChar(str) {
const charMap = {};
let max = 0;
let maxChar = '';
for(let char of str){
if(charMap[char]){
charMap[char]++;
}else{
charMap[char] = 1;
}
}
for(let char in charMap){
if(charMap[char] > max){
max = charMap[char];
maxChar = char;
}
}
return maxChar;
}
Result:
maxChar('355385')
"5"
Another way to get the most frequent character in a string - sort frequency map into an array and then return the first (greatest) value from that array:
function highest (string) {
let array = Array.from(string);
let frequencyMap = {};
array.forEach((value, index) => {
if (!frequencyMap[value]) {
frequencyMap[value] = 0;
}
frequencyMap[value] += 1;
})
let frequencyArray = Object.entries(frequencyMap);
frequencyArray.sort((a, b) => {
if (a[1] < b[1]) {
return 1;
}
if (a[1] > b[1]) {
return -1;
}
return 0;
});
return(frequencyArray[0][0]);
}
console.log(highest("hello World"));
returns "l"
None of the answers above take into consideration that JavaScript internally uses UTF-16
const s = "πŸ˜„πŸ˜…πŸ˜„πŸ˜„πŸ˜…πŸ˜…πŸ˜„πŸ˜„πŸ˜±πŸ˜±πŸ˜„";
function getMostFrequentChar(s) {
const len = s.length;
const freq = {};
let maxFreq = 0;
let maxChar;
for (let i = 0; i < len; ++i) {
const isPair = (s.charCodeAt(i) & 0xF800) == 0xD800;
const c = isPair ? s.substr(i++, 2) : s[i];
const f = (freq[c] || 0) + 1;
freq[c] = f;
if (f > maxFreq) {
maxFreq = f;
maxChar = c;
}
}
return {maxFreq, maxChar, freq}
}
console.log(getMostFrequentChar(s));
Note: the code above assumes the string is valid UTF-16. It's possible to construct a string that is not valid UTF-16 in which case maybe you could change isPair to
const isPair = len - i > 1 &&
s.charCodeAt(i ) & 0xF800) == 0xD800 &&
s.charCodeAt(i + 1) & 0xF800) == 0xD800;
But it's not clear what a character with an invalid UTF-16 value means.
It also won't handle more funky unicode
s = "πŸ‘¦πŸΏπŸ‘¦πŸ‘¦πŸΏπŸ‘¦πŸ‘¦πŸ»πŸ‘¦πŸ½πŸ‘¦πŸΎπŸ‘¦πŸΏ"
There are many graphmemes that take multiple unicode code points
Also, splitting the string using split is SSSSSSLLLLLOOOOWWWW and a huge memory hog if the string is long.
Here is yet another answer to this question:
For this I have considered that the character can be of whatevert kind except a space
function findHighestFreqInString(str) {
if (!str) return null
let cleanedStr = str.replace(/\s/g, '') //assumes no spaces needed
if (cleanedStr.length === 0) return null
let strObj = {}
let topChar = ''
for (let val of cleanedStr) {
strObj[val] = (strObj[val] || 0) + 1
if (topChar === '' || strObj[val] >= strObj[topChar]) topChar = val
}
return topChar
}
Here is how you would use it:
findHighestFreqInString('my name is Someone') // returns: e
findHighestFreqInString('') // returns: Null
findHighestFreqInString(' ') // returns: Null
Here is:
let str = '355385';
function mostFrequentCharacter(str) {
let charactersArr = str.split(''),
bins = {};
charactersArr.map(el => bins[el] = (bins[el] || 0) + 1);
return Object.keys(bins).map(key => ({
name: key,
count: bins[key]
})).sort((a, b) => b.count - a.count)[0];
}
You can use the following solution to find the most frequent character in a string:
function getMostRepeatedCharacter(string) {
return string.split('').reduce((acc,char)=>{
let len = string.split(char).length - 1;
return len > acc[1] ? [char,len] : acc
},['',0])[0]
}
getMostRepeatedCharacter('wediuaududddd') // d
Want to share this ES6 functional approach. Please provide your input.
function maxChar(myStr) {
let charObj = {};
return [...myStr].reduce((_, char) => {
if (char in charObj) charObj[char]++;
else if (char !== " ") charObj[char] = 1;
return Object.keys(charObj).reduce((a, b) => {
return charObj[a] > charObj[b] ? a : b;
});
});
}
The simplest approach will be like this:
function maxChar(str) {
const charMap = {};
let max = 0;
let maxChar = '';
start by making an object of words and how many they repeated, to do that we have to loop through the string using for of and implementing the conditions:
for (let char of str) {
if (charMap[char]) {
charMap[char]++;
} else {
charMap[char] = 1;
}
}
and now loop through the object using for in
for (let char in charMap) {
if (charMap[char] > max) {
max = charMap[char];
maxChar = char;
}
}
return maxChar;
}
this is another (bizarre) way
It substitute the current character with blank for check how many times is present in the string making the difference of length with original pattern
var str = "355385";
var mostLength = 0;
var characterMostLength;
for(t = 0; t< 10; t++)
{
var res = str.length - str.replace(new RegExp(t, "g"), "").length;
if (res > mostLength){
characterMostLength = t;
mostLength = res;
}
}
function solution(N) {
var textToArr = N.split('');
var newObj = {};
var newArr = [];
textToArr.map((letter) => {
if(letter in newObj){
newObj[letter] = newObj[letter]+1;
} else {
if(letter !== ' '){
newObj = Object.assign(newObj, {[letter]: 1})
}
}
});
for(let i in newObj){
newArr.push({name: i, value: newObj[i]})
}
var res = newArr.sort((a,b) => b.value-a.value)[0];
return res.name+':'+res.value
}
solution("hello world");
this is a simple Idea that only includes one pass-through with a hashmap. The only thing this does not do is handle several max numbers. I really hope you enjoy my solution :) .
function maxChar(str) {
//Create the output and the hashmap
let m = {}, ans
//Loop through the str for each character
//Use reduce array helper because of the accumulator
str.split('').reduce((a, c) => {
//Increments Map at location c(character) unless it does not already exist
m[c] = m[c] + 1|| 1
//This checks to see if the current passthrough of m[c] is greater than or equal to the accumulator, if it is, set the answer equal to the current character. If it's not keep the ans the same.
ans = m[c] >= a ? c : ans
//Only increment the accumulator if Map at location c(character) is greater than the accumulator. Make sure to return it otherwise it won't increment.
return a = m[c] > a ? a + 1 : a
}, 1)
//Lastly return the answer
return ans
}
Simplest way to find maximum number of occurring character in string
var arr = "5255522322";
var freq:any = {};
var num;
for(let i=0;i<arr.length;i++) {
num = arr[i];
freq[num] = freq[num] >= 1 ? freq[num] + 1 : 1;
}
var sortable:any = [];
for(let i in freq)
{
sortable.push(i);
}
var max = freq[sortable[0]];
var data:any = "";
var value = sortable[0];
for(let i=0;i<sortable.length;i++) {
if(max > freq[sortable[i]]){
data = "key" + value + " " + "value" + max;
}else{
value = sortable[i]
max = freq[sortable[i]];
}
}
console.log(data);
function maxChara(string) {
charMap = {};
maxNum = 0;
maxChar = "";
string.toString().split("").forEach(item => {
if (charMap[item]) {
charMap[item]++;
} else {
charMap[item] = 1;
}
});
for (let char in charMap) {
if (charMap[char] > maxNum) {
maxNum = charMap[char];
maxChar = char;
}
}
return maxChar;
}
let result = maxChara(355385);
console.log(result);
Here str will the string that needs to be verified.
function maxCharacter(str){
let str1 = str; let reptCharsCount=0; let ele='';let maxCount=0;
let charArr = str1.split('');
for(let i=0; i< str1.length; i++){
reptCharsCount=0;
for(let j=0; j< str1.length; j++){
if(str1[i] === str1[j]) {
reptCharsCount++;
}
}
if(reptCharsCount > maxCount) {
ele = str1[i];
maxCount = reptCharsCount;
}
}
return ele;
}
input
maxCharacter('asdefdfdsdfseddssdfsdnknmwlqweeeeeeeesssssssssssseeee');
output
"s"
function freq(str) {
var freqObj = {};
str.forEach((item) => {
if (freqObj[item]) {
freqObj[item]++;
}
else {
freqObj[item] = 1;
}
});
return freqObj;
}
function findmaxstr(str) {
let max = 0,res,freqObj;
freqObj = freq(str.split(""));
for(let keys in freqObj){
if (freqObj[keys] > max) {
max = freqObj[keys];
res = keys;
}
}
console.log(res);
return res;
}
findmaxstr("javasdasdsssssscript");
const maxChar = (str) => {
let obj = {};
for (let char of str) {
(!obj[char]) ? obj[char] = 1: obj[char]++;
}
maxCharcount = Math.max(...Object.values(obj));
const key = Object.keys(obj).filter(key => obj[key] === maxCharcount);
console.log(`Most repeated character/characters in the given string "${str}" is/are given below which repeated ${maxCharcount} times`);
console.log(...key);
}
maxChar("355385");
Here is the code, where it also checks for lower and upperCase characters with the same max count and returns a Lower ASCII character as a Max.
function mostFrequent(text) {
let charObj={}
for(let char of text){
if(char!==' '){
if(charObj.hasOwnProperty(char)) charObj[char]=charObj[char]+1;
else charObj[char]= 1
}
}
let maxOccurance= Object.keys(charObj)[0], i=0;
for(let property in charObj){
if(i>0){
if(charObj[property]> charObj[maxOccurance])
maxOccurance= property
else if(charObj[property]=== charObj[maxOccurance])
{
if(property<maxOccurance)
maxOccurance=property
}
}
i++
}
return [maxOccurance, charObj[maxOccurance]]
}
let str = '355385';
let max = 0;
let char = '';
str.split('').forEach((item) => {
let current = str.split(item).length;
if (current > max) {
max = current;
char = item;
}
});
console.log(char + ' occurred ' + (max - 1) + ' times');
var exp = '35585' ;
var expCounts = { };
let maxChar = ''
let count = 0
for(let i = 0; i < exp.length; i++){
let char = exp[i]
expCounts[char] = expCounts[char] + 1 || 1
if(expCounts[char] > count){
maxChar = char
count = expCounts[char]
}
console.log(maxChar)
}
function checkNoofOccurenance(string) {
const arr = [...new Set(string.split(''))].sort();
const finalObj = {};
arr.forEach((item) => {
finalObj[item] = string.split(item).length - 1;
});
const item=Object.keys(finalObj).reduce((occ, toBeComapir)=>finalObj[occ]>finalObj[toBeComapir]?occ:toBeComapir)
return item;
}
Using Hasmaps we can find the most frequent char and occurrence all in O(N) time complexity. Below is the code. I have used one hasmap to save all the values and while i am doing it, i am also calculating the max occurrence and the max char.
var mostFreq = function(s) {
let myMap = new Map();
let temp;
let counter = 0;
let mostFrequentChar;
for(let i =0;i <s.length;i++){
if(myMap.has(s.charAt(i))){
temp = myMap.get(s.charAt(i));
temp = temp + 1;
myMap.delete(s.charAt(i));
myMap.set(s.charAt(i) , temp)
if(temp > counter){
counter = temp;
mostFrequentChar = s.charAt(i);
}
}else{
myMap.set(s.charAt(i), 1)
}
}
//if you want number of occerance of most frequent char = counter
//if you want list of each individual char and its occurrence = myMap
//if you just want the char that is most frequence = mostFrequentChar;
return mostFrequentChar;
};
If you want the count of the letter as well, You can do this
const { letter, count } = input.split("").reduce(
(acc, letter) => {
const count = input.split(letter).length - 1;
return count > acc.count
? { letter, count }
: { letter: acc.letter, count: acc.count };
},
{ letter: "", count: 0 }
);
Here We are splitting the string, applying a reduce to the result. The Reduce Counts how many instances of a character are there in a string, using input.split(letter).length - 1; And if the count is greater than the previous count, updates the accumulated value to be the current value
let string = "355385";
function printFirstRepeat(str){
let output= {};
for (let char of str) {
char = char.toLowerCase();
output[char] = ++output[char] || 1;
if(output[char] > 1) return char;
}
return "Not Found"
}
console.log(printFirstRepeat(string));
Algorithm: Find maximum occurring character in a string (time complex: O(N))
I'll provide my solution to this algo-problem by utilizing the most recent concepts of javascript
const getMaxCharacter = (str) => {
let max = 0;
let maxChar = '';
str.split('').forEach((char) => {
if (str.split(char).length > max) {
max = str.split(char).length - 1;
maxChar = char;
}
});
return `The max letter is : ${maxChar} and the max number of times it is seen is: ${max} times`;
};
Let's express an easy way of testing the function logic I wrote it:
const letter = 'Hello Student';
getMaxCharacter(letter);
In the function developed, I've used the concepts below:
Arrow Function
Anonymous Funciton
Declare property by using let/const
Template Literals
forEach(); (array helper) & split()
This is simple and optimized solution and it returns the first occurring char if there are chars equals in counts
function maxOccurance(str) {
let maxOccurringChar = "";
const charMap = {};
for (let index = 0; index < str.length; index++) {
const ele = str.charAt(index);
if (!charMap[ele]) {
charMap[ele] = {
startIndex: index,
value: 1
};
} else {
charMap[ele].value = charMap[ele].value + 1;
}
if (
!maxOccurringChar ||
charMap[maxOccurringChar].value < charMap[ele].value
) {
maxOccurringChar = ele;
} else if (
charMap[maxOccurringChar].value === charMap[ele].value &&
charMap[ele].startIndex < charMap[maxOccurringChar].startIndex
) {
maxOccurringChar = ele;
}
}
return maxOccurringChar;
}
console.log( maxOccurance("bacdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz")
);
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>
<body>
<p id = "myString">Hello World! I am Julio!</p>
<p id = "mRCharacter"></p>
<script>
var string = document.getElementById("myString").innerHTML;
var mRCharater = mostRepetedCharacter(string);
document.getElementById("mRCharacter").innerHTML = mRCharater;
console.log(mRCharater);
function mostRepetedCharacter(string){
var mRCharater = "";
var strLength = string.length;
var i = 0;
var count = 0;
var max = 0;
var rest = strLength - 1;
while (i < strLength){
var j = i + 1;
while (j <= rest){
if (string[i] === string[j]){
count++;
}
if (count > max){
max = count;
mRCharater = string[i];
}
j++;
}
i++;
count = 0;
}
return mRCharater;
}
</script>
</body>
</html>
enter code here

Categories

Resources