Задача с конкатенацией строк

81
04 апреля 2022, 17:00

Функция получает массив из целих чисел нужно последующие числа объединить через символ - и в конце вернуть строку. Я почти решил задачу но есть маленькая проблема, на которую указал в комментариях.

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'

Как правильно решить задачу?

Answer 1

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]));

Answer 2

Можно, например, так:

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]));

Answer 3

Это мое изначальное решение, оставлю тут чтобы понимался смысл решения, оно более читаемое

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]));  

READ ALSO
Помогите понять структуру кода и решение задачи(многомерные массивы) [закрыт]

Помогите понять структуру кода и решение задачи(многомерные массивы) [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

122
Повторный onclick

Повторный onclick

Если нажать на картинку, то она будет следовать за курсоромНо а как сделать так, чтобы при втором клике на картинку она бы уже отстала от курсора...

234