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

133
8

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

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. Для этого примера мой вывод должен быть:

правда

правда

ложный

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

спросил(а) 2021-01-19T12:28:45+03:00 6 месяцев, 1 неделя назад
1
Решение
161

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

!![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 существует.

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

ответил(а) 2021-01-19T12:28:45+03:00 6 месяцев, 1 неделя назад
141

Вы можете использовать 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]));

ответил(а) 2021-01-19T12:28:45+03:00 6 месяцев, 1 неделя назад
118

Просто попробуйте этот способ с помощью метода 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);

ответил(а) 2021-01-19T12:28:45+03:00 6 месяцев, 1 неделя назад
89

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

ответил(а) 2021-01-19T12:28:45+03:00 6 месяцев, 1 неделя назад
46

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

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

ответил(а) 2021-01-19T12:28:45+03:00 6 месяцев, 1 неделя назад
46

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

    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;
}

ответил(а) 2021-01-19T12:28:45+03:00 6 месяцев, 1 неделя назад
46

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

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)

ответил(а) 2021-01-19T12:28:45+03:00 6 месяцев, 1 неделя назад
45

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

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

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

(num <= arr[idx + 1]) || (idx === arr.length - 1)

если текущее число меньше или равно следующему числу...

ИЛИ ЖЕ...

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

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

ответил(а) 2021-01-19T12:28:45+03:00 6 месяцев, 1 неделя назад
-5

Простой способ

   var arr = [ [ 1, 2, 3, 4, 5 ], [ 1, 2, 8, 9, 9 ], [ 1, 2, 2, 3, 2 ] ];
for (var j in arr) {
sorted = true;
for (var i = 0; i < arr[j].length - 1; i++) {
if (arr[j][i] > arr[j][i+1]) {
sorted = false;
break;
}
}
console.log(sorted);
}

Ссылка

Как javascript foreach работает с многомерными массивами?

Как проверить, отсортирован ли массив

ответил(а) 2021-01-19T12:28:45+03:00 6 месяцев, 1 неделя назад
-5

Если я понимаю, что вы имеете в виду, вы хотите знать, отсортирован ли массив или нет. Это пример такого решения, попробуйте. Я вставил несколько кодов ниже.

var myArray=[1,4,3,6];

if(isSorted(myArray)){

console.log("List is sorted");
}else{
console.log("List is not sorted");
}

function isSorted(X){

var sorted=false;

for(var i=0;i<X.length;i++){

var next=i+1;

if (next<=X.length-1){

if(X[i]>X[next]){
sorted=false;
break;
}else{
sorted=true;

}
}

}

return sorted;

}

ответил(а) 2021-01-19T12:28:45+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема