最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

arrays - Javascript - How Do I Check if 3 Numbers Are Consecutive and Return Starting Points? - Stack Overflow

programmeradmin4浏览0评论

If I have an array of [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7] and wanted to find each case of 3 consecutive numbers (whether ascending or descending), how would I do that?

Second part would be then to alert an array with the index of each of these sequences.

For ex. the previous array would return [0,4,6,7].

So far I have this... which is a rough start

var arr = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var results = [];

for (var i = 1; i < arr.length; i++) {
    if ((arr[i] - arr[i-1] != 1) && (arr[i] - arr[i+1] != 1)) {
        results.push(arr[i]);
    }

}
alert(results);

Thanks for the help!

Thanks for the math.abs pointer. This is what I ended up doing:

var array = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var indexes = [];

for(var i=0; i < array.length; i++) {
    var diff = array[i+1] - array[i];
    if(Math.abs(diff)==1 && array[i+1]+diff == array[i+2]) {
        indexes.push(i);
    }
}
alert(indexes);

If I have an array of [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7] and wanted to find each case of 3 consecutive numbers (whether ascending or descending), how would I do that?

Second part would be then to alert an array with the index of each of these sequences.

For ex. the previous array would return [0,4,6,7].

So far I have this... which is a rough start

var arr = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var results = [];

for (var i = 1; i < arr.length; i++) {
    if ((arr[i] - arr[i-1] != 1) && (arr[i] - arr[i+1] != 1)) {
        results.push(arr[i]);
    }

}
alert(results);

Thanks for the help!

Thanks for the math.abs pointer. This is what I ended up doing:

var array = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var indexes = [];

for(var i=0; i < array.length; i++) {
    var diff = array[i+1] - array[i];
    if(Math.abs(diff)==1 && array[i+1]+diff == array[i+2]) {
        indexes.push(i);
    }
}
alert(indexes);
Share Improve this question edited Nov 28, 2012 at 15:02 Bill the Lizard 406k211 gold badges572 silver badges889 bronze badges asked May 24, 2012 at 20:06 YasirYasir 9095 gold badges13 silver badges33 bronze badges 5
  • But 0 isn't in your 'previous array'. – David Thomas Commented May 24, 2012 at 20:10
  • I don't understand how [0,4,6,7] could be anything in your example... – Sebas Commented May 24, 2012 at 20:11
  • i get 0 and 4, but 6,7? I think you are talking about the index of the starting number. – Mukesh Soni Commented May 24, 2012 at 20:12
  • The trick is to notice that the OP has given two different example arrays. There's one element missing from the first one. – JJJ Commented May 24, 2012 at 20:14
  • The example results include an array defined as: indexOfMatch, item0, item1, item2 – robrich Commented May 24, 2012 at 20:23
Add a comment  | 

5 Answers 5

Reset to default 4

It'd be interesting to know the context of this task as well... Anyway, here's my solution:

var arr     = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var results = [];
var limit   = arr.length - 1; 

var sequence = 0;
for (var i = 0; i < limit; ++i) {
  var diff = arr[i+1] - arr[i];
  if (sequence && sequence === diff) {
    results.push(i-1);
    continue;
  }
  sequence = (diff === 1 || diff === -1) // or ... Math.abs(diff) === 1
           ? diff
           : 0;
}
console.log(results);

The idea is simple: we don't need to compare two neighbors twice. ) It's enough to raise a kind of sequence flag if this comparation starts a sequence, and lower it if no sequence is there.

This is a very literal approach to your question - I have only checked forwards numbers, but adding reverse would be done almost in the same way

var arr = [1, 2, 3, 4, 10, 9, 8, 9, 10, 11, 7];
var results = [];

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

    // if next element is one more, and one after is two more
    if (arr[i+1] == arr[i]+1 && arr[i+2] == arr[i]+2){

        // store the index of matches
        results.push(i);

        // loop through next numbers, to prevent repeating longer sequences
        while(arr[i]+1 == arr[i+1])
            i++;
    }

}
console.log(results);

You need to look closely at your expression in your if statement.

It currently says:

  • If the difference between the current element and previous element is not 1, and
  • If the difference between the current element and next element is not 1

then it's a result.

So, on the face of it, that's an incorrect logical statement to determine if the current element is in the middle of a consecutive set of three.

In addition, this doesn't account for an ascending or descending set of three either.

Try figuring out, in words, what the condition would look like and go from there.

Some things to consider

  • I suggest you start going through the list from i = 2
  • Research Math.abs

This is I think a simpler way to do it. First check the average of the left and right number is equal to the middle, then check that the absolute value of either neighbor is one.

var arr = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var indexes = [];

for(var i=1; i < arr.length; i++) {
    if((arr[i-1]+arr[i+1]) / 2 == arr[i] && Math.abs(arr[i]-arr[i-1]) == 1) {
        indexes.push(i-1);
    }
}
alert(indexes);
var arr = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var results = [];

for (var i = 0; i < arr.length - 2; i++) {
    if ((arr[i+1] - arr[i] === 1) && (arr[i+2] - arr[i+1] === 1)) {
        results.push({
            i:i,
            mode:'up',
            arr:[arr[i],arr[i+1],arr[i+2]
        });
    }
    if ((arr[i+1] - arr[i] === -1) && (arr[i+2] - arr[i+1] === -1)) {
        results.push({
            i:i,
            mode:'down',
            arr:[arr[i],arr[i+1],arr[i+2]
        });
    }

}
alert(results);
发布评论

评论列表(0)

  1. 暂无评论