it-swarm.com.ru

Проверьте массив в JS - список отсортирован?

Мне нужно создать программу, которая проверяет список в массиве отсортирован. У меня есть три входных данных:

1,2,3,4,5 

1,2,8,9,9 

1,2,2,3,2

Итак, вот мой код:

let sorts = +gets(); // 3
let list = [];

for (let i = 0; i < sorts; i++) {
    list[i] = gets().split(',').map(Number); // The Array will be: [ [ 1, 2, 3, 4, 5 ], [ 1, 2, 8, 9, 9 ], [ 1, 2, 2, 3, 2 ] ]
}

for (let i = 0; i < list[i][i].length; i++){
    if (list[i][i] < list[i][i +1]) {
        print('true');
    } else {
        print('false');
    }
}

Мне нужно напечатать для всех списков на новой строке true или false. Для этого примера мой вывод должен быть:

правда

правда

false

Я понятия не имею, как решить эту проблему.

13
Николай Матев

var str = ["1,2,3,4,5", "1,2,8,9,9", "1,2,2,3,2"];

for (var i in str){
    var list = str[i].split(',').map(Number);
    console.log(list);
    var isSorted = true;
    for(var j = 0 ; j < list.length - 1 ; j++){
        if(list[j] > list[j+1]) {
            isSorted = false;
            break;
        }
    }
    console.log(isSorted);
}

5
Jin

Как насчет чего-то вроде этого:

!![1,2,3,4,5].reduce((n, item) => n !== false && item >= n && item)
// true

!![1,2,8,9,9].reduce((n, item) => n !== false && item >= n && item)
// true 

!![1,2,2,3,2].reduce((n, item) => n !== false && item >= n && item)
// false

Reduce будет буквально уменьшать массив до одного значения - в нашем случае это логическое значение. 

Здесь мы вызываем функцию за одну итерацию, (n, item) - это сигнатура нашей функции, ее тело - n !== false && item >- n && item - мы проверяем, существует ли n (n это наш аккумулятор - читай!), Проверяем, больше ли item, чем n, и делаем конечно item существует.

Это происходит для каждого элемента в вашем массиве. Затем мы используем !! для принудительного перевода результата в истинное логическое значение.

16
Stuart

Вы можете использовать array#every , чтобы проверить, больше ли каждое значение, чем предыдущее значение.

const isSorted = arr => arr.every((v,i,a) => !i || a[i-1] <= v);
console.log(isSorted([1,2,3,4,5]));
console.log(isSorted([1,2,8,9,9])); 
console.log(isSorted([1,2,2,3,2]));

13
Hassan Imam

Просто попробуйте этот способ с помощью метода slice: он проверит, меньше ли предыдущий элемент, чем следующий элемент. Если условие истинно для каждого элемента, он вернет true, иначе false 

arr.slice(1).every((item, i) => arr[i] <= item);

Оформить заказ ниже образец как демо 

var arr = [[1,2,3,4,5],[1,2,8,9,9],[1,2,2,3,2],[0,1,2,3,4,5]];

function isArrayIsSorted (arr) {
  return arr.slice(1).every((item, i) => arr[i] <= item)
}

var result= [];
for (var i = 0; i < arr.length; i++){
result.Push(isArrayIsSorted(arr[i]))
}
console.log(result);

8
Ramesh Rajendran

Сортированные списки номеров

Включая отрицательные числа, нули и соседние дубликаты

Используйте every() метод, который вернет true, если все числа будут в порядке, в противном случае он вернет false. Условия следующие:

(num <= arr[idx + 1]) || (idx === arr.length - 1)
  1. если текущее число меньше или равно следующему числу ...

    ИЛИ ЖЕ...

  2. если текущий индекс равен последнему индексу ...

    return 1 (truthy)
    

Демонстрация

var arr0 = [1, 2, 3, 4, 5];
var arr1 = [1, 2, 8, 9, 9];
var arr2 = [1, 2, 2, 3, 2];
var arr3 = [0, 0, 0, 1, 3];
var arr4 = [-3, 0, 1, 3, 3];
var arr5 = [-4, -2, 0, 0, -4];

function sorted(array) {
  return array.every(function(num, idx, arr) {
    return (num <= arr[idx + 1]) || (idx === arr.length - 1) ? 1 : 0;
  });
}

console.log(arr0 +' | '+sorted(arr0));
console.log(arr1 +' | '+sorted(arr1));
console.log(arr2 +' | '+sorted(arr2));
console.log(arr3 +' | '+sorted(arr3));
console.log(arr4 +' | '+sorted(arr4));
console.log(arr5 +' | '+sorted(arr5));

3
zer00ne

Есть много способов, как это сделать. Вот мой 

const isArraySorted = array =>
  array
  .slice(0) // clone array
  .sort((a, b) => a - b) // sort it
  .every((el, i) => el === array[i]) // compare with initial value)

0
Dima Vishnyakov

Вы можете проверить, имеет ли stringified отсортированная копия исходного массива то же значение, что и исходный. Может быть, не самый крутой или производительный, но мне нравится его простота и ясность. 

const arraysToCheck = [
  [1, 2, 3, 4, 5],
  [1, 2, 8, 9, 9],
  [1, 2, 2, 3, 2]
]

const isSorted = arraysToCheck.map(
  item => JSON.stringify([...item].sort((a, b) => a - b)) === JSON.stringify(item)
 );


console.log(isSorted);

0
HynekS

Может быть, вы можете использовать этот метод, который проверяет, правильно ли отсортирован:

    var arr1 = [1, 2, 3, 4, 4];
    var arr2 = [3, 2, 1];

		console.log(checkList(arr1));
		console.log(checkList(arr2));
    
    function checkList(arr) {
        for (var i = 0; i < arr.length; i++) {
            if (arr[i + 1]) {
                if (arr[i] > arr[i + 1]) {
                    return false;
                }
            }

        }
        return true;
    }

0
André