поиск последовательного в строке с использованием javascript - PullRequest
5 голосов
/ 19 июня 2020

Я собираюсь найти последовательную строку чисел в строке, которая начинается с 1. Например, у меня есть эта строка.

"456000123456009123456780001234000"

Здесь последовательные строки будут

"123456", "12345678", "1234"

Как Могу ли я получить результат выше, используя Javascript эффективно? Код выглядит следующим образом.

findSequential("456000123456009123456780001234000");
//expected output
"123456", "12345678", "1234"

*** примечание: «1» само по себе не является последовательным, например:

"3938139" - has no sequence
"39381249" - has "12"

Принято решение на любом языке, но предпочитаю Javascript или C. Спасибо за помощь!

Ответы [ 5 ]

2 голосов
/ 19 июня 2020

Вот рекурсивная версия, которая отслеживает индекс и длину текущей последовательности до тех пор, пока ей действительно не потребуется ее вывести, а затем вызывает substr. (Также полезно легко преобразовать для возврата только местоположений последовательностей в строке.)

function f(s, i=1, l=0){
  if (i == s.length)
    return l ? [s.substr(i-l, l)] : [];
    
  if (s[i] != Number(s[i-1]) + 1 && l)
    return [s.substr(i-l, l)].concat(f(s, i+1, 0));
    
  if (s[i] == 2 && s[i-1] == 1)
    return f(s, i+1, 2);
    
  return f(s, i+1, l ? l+1: 0);
}

var strs = [
  "456000123456009123456780001234000",
  "1212",
  "12",
  "23"
];

for (let s of strs){
  console.log(s);
  console.log(JSON.stringify(f(s)));
  console.log('');
}
2 голосов
/ 19 июня 2020

Простой для l oop должен быть в состоянии достичь этого. В JavaScript:

function findSequential(s) {
    const res = []
    let current = []
    let num = 1
    for(let char of s) {
      if (char == num) {
        current.push(char)
        num ++
      } else if (current.length > 1) {
        res.push(current.reduce((acc, cur) => acc += cur, ''))
        if (char == 1) {
          current = ['1']
          num = 2
        } else {
          current = []
          num = 1
        }
      } else if (current.length === 1) {
        current = []
        num = 1
      }
    }
    if (current.length > 1) {
      res.push(current.reduce((acc, cur) => acc += cur, ''))
    }
    return res
}

console.log(findSequential('31234121'))
1 голос
/ 19 июня 2020

очень простой и короткий код

s= "456000123456009123456780001234000"
    var p
    var r=''
    for(let n of s ){
      if(n==1||n-p==1){
        r+=n, p=n
        r.length>1&&r.charAt(r.length-1)==1?r=r.substring(0,r.length-1)+'-1':r
      }
    }
    console.log(r.split('-'))
1 голос
/ 19 июня 2020

Наконец, у меня есть для вас этот код

var str = "456000123456009123456780001234000";
var length = str.length;
var out= "";

for(i = 0; i < length; i++){
	if(str[i] == 1){
		out += str[i];
		var j = i;
		do{		
			j++;
			out += str[j];
		} while(str[j + 1] > out[out.length - 1])
		out += " ";
	}
}

console.log(out);	// Outputs: 123456 12345678 1234
1 голос
/ 19 июня 2020

Вы можете сделать это так:

function findSequential(str) {
  const res = [];
  let currentHigh = 0;
  for (let char of str) {
    if (+char === currentHigh + 1) {
      currentHigh++;
    } else if (currentHigh > 0) {
      res.push(buildSequence(currentHigh))
      currentHigh = +char === 1 ? 1 : 0;
    }
  }
  if (currentHigh > 0) {
    res.push(buildSequence(currentHigh));
  }
  return res;
}

function buildSequence(max) {
  if (max <= 1) { return "1"; }
  else { return buildSequence(max - 1) + max; }
}

console.log(findSequential("456000123456009123456780001234000"));
// ["123456", "12345678", "1234"]

console.log(findSequential("12"));
// ["12"]

console.log(findSequential("1212"));
// ["12", "12"]

console.log(findSequential("23"));
// []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...