我接受了面试,他们给了我几个问题来练习 其中一个是: 检查Array是否处于Descending或Ascending顺序,如果Descending和Ascending,则检查是否有警告消息,如果没有排序则检查以上情况。
这是我写的,但它不起作用:
for ( i = 0; i < myArrey2.length; i++) {
if (myArrey2[i] > myArrey2[i + 1]) {
alert ("Ascending");
} else if(myArrey2[i] < myArrey2[i + 1]){
alert ("Descending");
}else {
alert("not sorrted");
}
break;
}
有人能协助我这个吗?
谢谢你的帮助。
答案 0 :(得分:0)
检查数组前两个元素的顺序。然后浏览阵列的其余部分,检查它们是否按相同的顺序排列。
var order;
if (a[0] > a[1]) { // first two are descending
order = "Descending";
for (var i = 1; i < a.length-1; i++) {
if (a[i] <= a[i+1]) {
order = "Not ordered";
break;
}
}
} else {
order = "Ascending";
for (var i = 1; i < a.length-1; i++) {
if (a[i] > a[i+1]) {
order = "Not ordered";
break;
}
}
}
console.log(order);
这假设所有数字都不同。如果它们可以相等,则需要跳过数组开头的任何一系列相等元素,直到找到第一个不等对。
在尝试确定整个数组的某些内容时要记住的重要事项是,在循环结束之前,您无法知道它是真的。所以你不能在每次循环中报告它的上升或下降 - 你知道的是这两个元素是上升还是下降,你仍然没有确定任何关于其余的元素数组。另一方面,一旦条件为假,你就可以摆脱循环,不需要检查数组的其余部分。
答案 1 :(得分:0)
首先,循环遍历从第二个元素到结尾的数组,以便通过从中减去前一个项目来创建从一个项目到下一个项目的更改数组。然后,检查所有项目是否完全相同(所有更改都等于0)。如果不是这种情况,请检查数组是否按升序排序(所有更改都大于或等于0)。如果不是,请检查数组是否按降序排序(所有更改都小于或等于0)。最后,如果数组不属于这三个类别中的任何一个,那么它就是无序的。
function order(arr) {
const deltas = [];
for(let i = 1; i < arr.length; i++) {
deltas.push(arr[i] - arr[i - 1]);
}
if(deltas.every(change => change === 0)) {
return 'Both ascending and descending as every element is exactly the same.';
} else if(deltas.every(change => change >= 0)) {
return 'Ascending';
} else if(deltas.every(change => change <= 0)) {
return 'Descending';
}
return 'None';
};
答案 2 :(得分:0)
您可以执行以下操作;
返回的值应解释如下;
[ true, true ] // ascending orderly
[ false, true ] // descending orderly
[ _, false ] // not sorted
function check([x1, x2,...xs], s = [true, true]){
return xs.length ? [x1 < x2, s[1] && check([x2,...xs], [x1 < x2, (x1 < x2 && s[0]) === x1 < x2])[1]]
: [x1 < x2, s[0] === x1 < x2];
}
var as = [1,2,3,4,5,6],
bs = [6,5,4,3,2,1],
cs = [6,5,3,4,2,1];
console.log(check(as));
console.log(check(bs));
console.log(check(cs));
&#13;