#javascript
Получил задание: вывести цифру, которая повторяется в числе подряд наибольшее количество раз. Однако возникла одна проблема. К примеру возьмем такое число - 122233. По идее должно вывестись сообщение "||2||3||". То есть цифра два повторяется три раза. Однако выводится следующее "||3||3||". Значение переменной max сохраняется и все отлично, но значение перемнной s_1 равняется последнему числу. Я пробовал делать еще одну проверку в else, типа: if(same != max) { delete s_1; } Но не работало. Помогите пожалуйста, вот код: function same_numbers() { var number = document.getElementById('number').value; var replaced; var same; var s_1; var arr = []; while (number.length) { s_1 = number[0]; replaced = number.split(s_1).join(''); same = number.length - replaced.length; number = replaced; if (same == 1) { delete s_1; } else { (arr.push(same)); var max = Math.max.apply(Math, arr); } } alert( "||" + s_1 + "||" + max + "||" ); }
Ответы
Ответ 1
В этом моменте у вас происходит что то не понятное if (same == 1) { delete s_1; } else { (arr.push(same)); var max = Math.max.apply(Math, arr); } Если вам не важно какую именно цифру выводить в случае когда несколько максимумов, то можно считать так. function same_numbers() { var number = document.getElementById('number').value; var replaced; var same; var s_1; var arr = []; var digits = {}; while (number.length) { s_1 = number[0]; replaced = number.split(s_1).join(''); same = number.length - replaced.length; number = replaced; digits[s_1] = same; } var max_key = null; for(var key in digits) { if(max_key === null || digits[key] > digits[max_key]) { max_key = key; } } alert( "||" + max_key + "||" + digits[max_key] + "||" ); }Ответ 2
Интересное задание! Такое вот решение предлагаю: var number = 112223322; var answer = {number : '', count: 0}; (String(number).match(/((0+)|(1+)|(2+)|(3+)|(4+)|(5+)|(6+)|(7+)|(8+)|(9+))/g) || []) .map(function(val){ if (val.length > answer.count){ answer = {number: val.charAt(0), count: val.length}; } }); alert("||"+answer.number+"||"+answer.count+"||"); А твой код отладить немного сложно - названия переменных не слишком очевидны. P.S. Надо это задание, или подобное на код-гольф вынести. UPD: Надо заметить, приведённый код - анализирует именно последовательности. То есть максимальное количество цифр, идущих подряд . Из вопроса не совсем было понятно - надо анализировать просто количество цифр в числе, или количество цифр, идущих подряд.Ответ 3
например, вот такое решение: function same_numbers() { var number = document.getElementById('number').value; var max = number.split('').reduce(function(prev,curr,index,arr){ return (curr=parseInt(curr),!prev[curr] ? prev[curr]=1 : prev[curr]++, prev); }, new Array(10)).reduce(function(prev,curr,index,arr){ return (curr>prev[1] ? (prev[1]=curr,prev[0]=index) : 0, prev); }, [0,0]); // 0 - index, 1 - val alert('||' + max[0] + '||' + max[1] + '||'); }Ответ 4
Вот Вам универсальное решение для любых строк function getMaxChar(AStr) { if (AStr == "") return; var chars = String(AStr).split(""); chars.sort(); var counts = new Array(); counts.push({chr: chars[0], cnt: 1}); for (var i = 1; i < chars.length; i++) { if (chars[i] == chars[i - 1]) counts[counts.length - 1].cnt++; else counts.push({chr: chars[i], cnt: 1}); } var maxIdx = 0; for (var i = 1; i < counts.length; i++) { if (counts[i].cnt > counts[maxIdx].cnt) maxIdx = i; } return counts[maxIdx]; } console.log(getMaxChar(1122234)); console.log(getMaxChar('aaBBBcc'));Ответ 5
Найдите в строке группы с одинаковыми цифрами и отсортируйте по длине каждой в убывающем порядке. Первой будет искомая группа цифр. function same_numbers() { var number = document.getElementById("number").value; var result = number.split(/(([\s\S])\2*)/).sort(function(a, b) { return a.length > b.length ? -1 : 1; })[0]; alert(["", result, result.length, ""].join("||")); }
Комментариев нет:
Отправить комментарий