检查数组是下降,升序还是未排序?

时间:2017-07-08 20:57:14

标签: javascript

我刚刚开始使用javascript进行编程,我需要练习一些问题,以获得带有代码构建逻辑的EXP。 我得到了这个问题的功课,但由于某种原因我无法使它工作,即使它对我来说似乎是“逻辑”。 检查数组是使用循环降序,升序还是不分类。

我只是一个菜鸟,所以请尽量帮助我解决这个问题,因为我只能在学习中循环(:  这是我写的代码:

        var array = [1, 2, 3, 7 ];
        var d = 0;
        var c =0 ;
        var b = 1;
        var a = 0;
        for (var i = 1; i <= array.length; i++)
            {
                if (array[c]<array[b] && a!== -1  ){
                   d = -1;
                   c =c+1;
                   b = b+1;
                   if(c==array.length){
                    console.log("asc");
                     break;
                   }else{
                     continue;
                }

                } else if (array[c]>array[b] && d!==-1 ){
                           a = -1;
                           d= d+1;
                           b = b+1;
                    if(i=array.length){
                    console.log("dsc");
                    break;
               }else{continue;}

               } else{

                    console.log("unsorted array");
                    break;
                }

            }

9 个答案:

答案 0 :(得分:5)

Array.prototype.every将谓词传递给索引,您可以使用该索引获取元素的前身:

function isAscending(arr) {
    return arr.every(function (x, i) {
        return i === 0 || x >= arr[i - 1];
    });
}

在这里,我们检查每个项目(x)是否大于或等于它之前的项目(arr[i - 1])或者之前没有项目(i === 0)。

>=翻转<=isDescending

答案 1 :(得分:3)

“检查数组是使用循环降序,升序还是不分类”

// define the array
var array = [1,2,3,7];

// keep track of things
var isDescending = true;
var isAscending = true;

// we're looking ahead; loop from the first element to one before the last element
for (var i=0, l=array.length-1; i<l; i++)
{

   ////////////////////////////////////////////////////////////

   // log to the console to show what's happening for each loop iteration

   // this is the ith iteration 
   console.log("loop iteration %s", i);

   // breaking isDescending down:
   // is this value greater than the next value?
   console.log("A: (%s > %s) = %s", array[i], array[i+1], (array[i] > array[i+1]));

   // have all values been descending so far?
   console.log("B: isDescending: %s", isDescending);

   // if this value is greater than the next and all values have been descending so far, isDescending remains true. Otherwise, it's set to false.
  console.log("are A and B both true? %s", (isDescending && (array[i] > array[i+1])));

   // add a line break for clarity
   console.log("");

   ////////////////////////////////////////////////////////////


   // true if this is greater than the next and all other so far have been true
   isDescending = isDescending && (array[i] > array[i+1]);

   // true if this is less than the next and all others so far have been true
   isAscending = isAscending && (array[i] < array[i+1]);

}

if (isAscending)
{
  console.log('Ascending');
}
else if (isDescending) 
{
  console.log('Descending');
}
else
{
  console.log('Not Sorted');
}

答案 2 :(得分:2)

这是一个需要某种循环的问题,有几个if语句,因为有几种情况需要解决:

  1. 数组为空或只有一个元素。
  2. 数组中的所有项目均相同
  3. 数组是递增的 - 两个元素之间的增量&gt; 0,但有些增量可能为0
  4. 数组正在下降 - 两个元素之间的差值&lt; 0,但有些增量可能为0
  5. 未分类 - 某些增量是&gt; 0,有些是&lt; 0
  6. 根据问题中定义排序的方式,案例1和案例1 2也可能被视为未排序

    &#13;
    &#13;
    function findSortOrder(arr) {
      if(arr.length < 2) { // case 1
        return 'not enough items'; // can also be 'unsorted'
      }
      
      var ascending = null;
      var nextArr = arr.slice(1); // create an array that starts from the 2nd element of the original array
    
      for(var i = 0; i < nextArr.length; i++) {
        if (nextArr[i] === arr[i]) { // neutral - do nothing
        } else if(ascending === null) { // define the the direction by the 1st delta encountered
          ascending = nextArr[i] > arr[i];
        } else if (ascending !== nextArr[i] > arr[i]) { // case 5
          return 'unsorted';
        }
      }
      
      if(ascending === null) { // case 2
        return 'all items are equal'; // can also be 'unsorted'
      }
      
      return ascending ? 'ascending' : 'descending'; // cases 3 & 4
    }
    
    console.log(findSortOrder([1])); // case 1
    
    console.log(findSortOrder([1, 1, 1, 1])); // case 2
    
    console.log(findSortOrder([1, 1, 2, 3, 7, 7])); // case 3
    
    console.log(findSortOrder([7, 2, 2, 1])); // case 4
    
    console.log(findSortOrder([7, 2, 1, 3, 2, 1])); // case 5
    &#13;
    &#13;
    &#13;

答案 3 :(得分:0)

您可以使用第二个元素的副本,并检查所需排序顺序的前任。

&#13;
&#13;
function checkArray(array) {
    var aa = array.slice(1);
    if (!aa.length) {
        return "Just one element";
    }
    if (aa.every((a, i) => array[i] > a)) {
        return "Ascending";
    }
    if (aa.every((a, i) => array[i] < a)) {
        return "Descending";
    }
    return "Unsorted";
}

console.log(checkArray([1, 2, 3, 4, 5]));
console.log(checkArray([5, 4, 3, 2, 1]));
console.log(checkArray([3, 1, 4, 2, 5]));
console.log(checkArray([42]));
&#13;
&#13;
&#13;

答案 4 :(得分:0)

function findOrder(array) {
    var asc = true;
    var desc = true;
    if(array.length < 2){
        return 'array is too small'
    }
    for(var i=1, len=array.length;i<len;i++){
        //if current element is bigger than previous array is not descending
        if(array[i]>array[i-1]){
            desc = false;
        //if current element is smaller than previous array is not ascending
        }else if(array[i]<array[i-1]){
            asc = false;
        }

        if(!asc && !desc){
            return 'not sorted'
        }
    }

    if(asc && desc){
        return 'array values are equal'
    }else if (asc){
        return 'array is ascending'
    }else {
        return 'array is descending'
    }
}

答案 5 :(得分:0)

实际上我们可以通过创建像natureOf这样的数组方法来做更多事情,它可以告诉我们更多关于数组的本质,而不仅仅是提升,下降或平坦。 Array.natureOf()将给出介于-1和1之间的值。如果为-1,则数组完全降序,1表示完全升序。中间的任何值都会给我们数组的倾向。正如您所猜测的那样,0意味着完全随机或平坦。 (如果需要,可以很容易地插入逻辑来区分随机和平面)

Array.natureOf = function(a){
                   var nature = a.reduce((n,e,i,a) => i && a[i-1] !== e ? a[i-1] < e ? (n.asc++, n)
                                                                                     : (n.dsc++, n)
                                                                        : n, {asc:0, dsc:0});
                   return (nature.asc - nature.dsc) / (a.length-1);
                 };
var arr = [1,2,3,4,5,6,7,8,9,10,7,11,13,14,15],
    brr = Array.from({length:2000000}, _ => ~~(Math.random()*1000000000));

console.log(`The nature of "arr" array is ${Array.natureOf(arr)}`);
console.log(`The nature of "brr" array is ${Array.natureOf(brr)}`);

答案 6 :(得分:0)

function isAscending(arr = []) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i + 1] <= arr[i]) {
      return false;
    }
  }
  return true;
}

答案 7 :(得分:0)

  console.log(checkSort([1, 2, 3, 3, 4, 5]));
  console.log(checkSort([5, 4, 3, 2, 1, 1]));
  console.log(checkSort([2, 5, 8, 9, 4, 6]));

  function checkSort(arr){

    var isDescending, isAscending;
    isDescending = isAscending = true;

    const len = arr.length - 1;

    for (var index = 0 ; index < len ; index++){
      if(isAscending)
      isAscending = arr[index] <= arr[index + 1];// '<=' so as to check for same elements

      if(isDescending)
      isDescending = arr[index] >= arr[index + 1];//'<=' so as to check for same elements
    }

    var result = "Array is ";
    
    if (isAscending)
    return result.concat("sorted in ascending order");
    
    if (isDescending)
    return result.concat("sorted in descending order");
    
    return result.concat("not sorted");

答案 8 :(得分:0)

function isAscending(arr) { 
  return arr
    .slice(1)
    .every((num,i) => num >= arr[i]); 
}

console.log(isAscending([1,2,3])); // true
console.log(isAscending([12,38,25])); // false
console.log(isAscending([103,398,52,629])); // false
  1. arr.slice(1) --> 允许我们在索引 1 而不是 0 处开始迭代
  2. 我们将使用“every”迭代“arr”并将当前的“num”与之前的“num”与“arr[i]”进行比较