Функция получает массив из целих чисел нужно последующие числа объединить через символ -
и в конце вернуть строку. Я почти решил задачу но есть маленькая проблема, на которую указал в комментариях.
function solution(x) {
let y = [];
let a = 0;
let b = 0;
for (let i = 0; i < x.length; i++) {
a = x[i];
b = a;
while (x[i + 1] - x[i] == 1) {
b = x[i + 1];
i++;
}
y.push(a == b ? a + '' : a + '-' + b);
}
return y.join(',');
}
console.log(solution([6, 7, 67, 54, 55, 56]));
// '6-7,67,54-56' но должен выводится '6,7,67,54-56'
console.log(solution([15, 16]));
// '15-16' но должен выводится '15, 16'
console.log(solution([1, 2, 3, 17, 18, 20, 28]));
// '1-3,17-18,20,28' но должен выводится '1-3,17,18,20,28'
Как правильно решить задачу?
function solution(x) {
let data = [],
first,
last;
let temp = x.concat([]);
for (let i = 0; i < temp.length; i++) {
first = last = temp[i];
while (temp[i + 1] === last + 1) {
last++;
i++;
}
data.push(first === last ? first : first + '-' + last);
}
return data.join(', ');
}
console.log(solution([1, 2, 3, 67, 17, 18, 20, 28]));
Можно, например, так:
function solution(x) {
let y = [];
let a;
let b;
for (let i = 0; i < x.length; i++) {
a = x[i];
b = a;
while (x[i + 1] - x[i] == 1) {
b = x[i + 1];
i++;
}
if (a == b) {
y.push(a + '');
}
else {
if ((b - a) == 1) {
y.push([a + '', b + '']);
}
else {
y.push(a + '-' + b);
}
}
}
return y.join(',');
}
console.log(solution([6, 7, 67, 54, 55, 56]));
console.log(solution([15, 16]));
console.log(solution([1, 2, 3, 17, 18, 20, 28]));
Или очень короткий вариант (тяжело читаемый):
function solution(x) {
let y = [];
let a;
let b;
for (let i = 0; i < x.length; i++) {
a = x[i];
b = a;
while (x[i + 1] - x[i] == 1) {
b = x[i + 1];
i++;
}
y.push(a == b ? a + '' : (b - a) == 1 ? [a + '', b + ''] : a + '-' + b);
}
return y.join(',');
}
console.log(solution([6, 7, 67, 54, 55, 56]));
console.log(solution([15, 16]));
console.log(solution([1, 2, 3, 17, 18, 20, 28]));
Это мое изначальное решение, оставлю тут чтобы понимался смысл решения, оно более читаемое
function solution(numbers) {
let skip = 0;
let result = ""
for(let i = 0; i < numbers.length; i++)
{
if(numbers[i+1] - numbers[i] === 1)
{
skip++;
if(skip === 1)
{
result = result.concat(numbers[i]+",");
}
if(skip === 2)
{
result= result.slice(0, -1);
result= result.concat("-");
}
}
else
{
skip = 0;
result = result.concat(numbers[i]+",");
}
};
return result.slice(0, -1);
}
console.log(solution([6, 7, 67, 54, 55, 56]));
console.log(solution([15, 16]));
console.log(solution([15, 16, 17]));
console.log(solution([1, 2, 3, 4, 5, 17, 18, 20, 28]));
console.log(solution([1, 2, 3, 17, 18, 20, 28]));
это решение тоже самое что выше просто оптимизированное(более краткое), но менее читамое/понимаемое
function solution(numbers) {
let skip = 0;
return numbers.reduce((prev, cur, i, arr) => {
skip = arr[i + 1] - arr[i] !== 1 ? 0 : skip + 1;
if (skip > 1) {
return prev.slice(0, -1) + "-";
}
return prev.concat(cur + ",");
}, "").slice(0, -1)
}
console.log(solution([6, 7, 67, 54, 55, 56]));
console.log(solution([15, 16]));
console.log(solution([15, 16, 17]));
console.log(solution([1, 2, 3, 4, 5, 17, 18, 20, 28]));
console.log(solution([1, 2, 3, 17, 18, 20, 28]));
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение
Если нажать на картинку, то она будет следовать за курсоромНо а как сделать так, чтобы при втором клике на картинку она бы уже отстала от курсора...