Упорядоченный массив в JavaScript

113
13 августа 2019, 09:30

Задан какой-то массив из цифр (JavaScript). Надо проверить,если удалить один элемент из массива,то станет ли массив упорядоченным? (Например - [1,4,2,3] - не упорядоченный,если удалить цифру 4,то тогда станет упорядоченным - [1,2,3]).Если есть такой элемент,удалив который,массив станет упорядоченным,то - return true ,если нет - return false. Надо проверить все варианты массивов,то-есть написать такую программу,который будет работать на всех вариантов массив.(Примеры массивов - [0,0,0,0],[0],[1,1,1],[1],[1,2,3],[2,3,4,5,4],[] и т.д. ) Эта работающая программа,но есть варианты массивов на которых оно не работает...

//JavaScript kod

function solution1(x) {
  if(x.length == 0 || x.length == 1) return false;
 let p = true;
  for(let i=0; i<x.length; i++) {
  let y = x.slice();
   y.splice(i,1)
  p = true;
  for(let j= 0; j < y.length; j++){
    if (y[j+1] && y[j]>y[j+1]) {
      p = false
    }
    if(j == y.length-1 && p == true){
      return true;
    }
  }    
  }
  return p;
}
console.log(solution1([]))
Answer 1

Как вариант, но пока что мне тоже не нравится немного.

Array.prototype.isAscending = function(){ 
    return this.every( (v,idx) => idx > 0 ? v > this[idx-1] : true ); 
}; 
 
 
function check(data){ 
  var  i =0, asc = false;   
  do {      
     asc = data.filter( (v,idx) => idx != i).isAscending(); 
     if(asc) return true;          
  } 
  while(++i < data.length) 
   
  return false; 
} 
 
console.log ( check([4,5,2,3] ) ); 
console.log ( check([5,2,3] ) ); 
console.log ( check([2,3] ) ); 
console.log ( check([2,3,1] ) ); 
console.log ( check([2,3,1, -1] ) );

так пожалуй лучше будет.

  Array.prototype.isAscending = function(){ 
        return this.every( (v,idx) => idx > 0 ? v > this[idx-1] : true ); 
    }; 
 
 
function check(data){ 
    return data.some( (v,i) => data.filter( (f,k) => k != i ).isAscending());                    
} 
 
 
    console.log ( check([4,5,2,3] ) ); 
    console.log ( check([5,2,3] ) ); 
    console.log ( check([2,3] ) ); 
    console.log ( check([2,3,1] ) ); 
    console.log ( check([2,3,1, -1] ) );

Answer 2

Вроде так. Не очень изящно, но, кажется, работает (во всяком случае, контрпримеров я не придумал):

function solution1(x) { 
  let anomalyCount = 0; 
  return !x.some((num, i, arr) => { 
    if (i > 0 && num < arr[i - 1]) { 
      return anomalyCount++; 
    } 
    if (i > 1 && num < arr[i - 2]) { 
      return true; 
    } 
    return false; 
  }) 
} 
 
console.log(solution1([])); // true 
console.log(solution1([0])); // true 
console.log(solution1([1, 2, 3, 4, 1])); // true 
console.log(solution1([0, 0, 0, 0, 0])); // true 
console.log(solution1([1, 2, 1, 2, 3])); // true 
console.log(solution1([1, 2, 1, 2, 3, 1])); // false 
console.log(solution1([1, 2, 3, 1, 2, 3])); // false

READ ALSO
Возврат view после ajax

Возврат view после ajax

Столкнулся с проблемой: при переходе по страницам через клавиши вперёд и назад браузера (Chrome), загружаемая страница распадается на кодТочнее...

118
Как передать name кнопки при клике с помощью классов?

Как передать name кнопки при клике с помощью классов?

Помогите пожалуйстаНужно, чтобы во время клика на кнопку в соседнем div-e выводился name этой кнопки

136
MySQL индексы и неравенства

MySQL индексы и неравенства

Есть запрос с подзапросом, который считает количество клиентов за сутки до текущей заявки:

191