Как перевернуть строку с числами, но не переставить 1 и 0?

Я изучаю случайные алгоритмы, и в настоящее время у меня есть запас по одному, где я должен перевернуть строку, содержащую числа, но я не должен переставлять 1 и 0 в строке, например, 2345678910 будет 1098765432.

Вот что я сделал до сих пор:

function split(str) {
  let temp = [];
  temp = str.split('');
  const backwards = [];
  const totalItems = str.length - 1;
  for (let i = totalItems; i >= 0; i--) {
    backwards.push(temp[i]);

  }
  return backwards.join('').toString();

}
console.log(split("10 2 3 U S A"));
console.log(split("2345678910"));

Ответ 1

Вы можете заменить 10 указанным символом, которого нет в тексте, и после запуска реализованного алгоритма заменить его на 10.

let out_of_alphabet_character = '#';
var reg_for_the_alphabet = new RegExp(out_of_alphabet_character, "g");

function specific_revert(str) {
  str = str.replace(/(10)/g, out_of_alphabet_character);
  let temp = [];
  
  temp = str.split('');
  const backwards = [];
  const totalItems = str.length - 1;
  for (let i = totalItems; i >= 0; i--) {
    backwards.push(temp[i]);
  }
  return backwards.join('').toString().replace(reg_for_the_alphabet, '10');
}
console.log(specific_revert("10 2 3 U S A"));
console.log(specific_revert("234567891010"));

Ответ 2

Вы можете reduce по сопоставленному массиву использование регулярного выражения. Это дороже, чем цикл for/, который объединяет строки, но было забавно выяснить это.

function split(str) {
  const re = /([A-Z23456789 ]+)|(10)/g
  return str.match(re).reduce((acc, c) => {

    // if the match is 10 prepend it to the accumulator
    // otherwise reverse the match and then prepend it
    acc.unshift(c === '10' ? c : [...c].reverse().join(''));
    return acc;      
  }, []).join('');
}

console.log(split('2345678910'));
console.log(split('10 2 3 U S A'));
console.log(split('2 3 U S A10'));

Ответ 3

Просто проверь для особого случая и закодируй нормальную логику или поменяй местами как обычно

    const reverse = str => {
    	let rev = "";
    	for (let i = 0; i < str.length; i++) {
        	if (str[i] === '1' && i + 1 < str.length && str[i+1] === '0') {
            	rev = '10' + rev;
                i++;
            } else rev = str[i] + rev;
        }
        
        return rev;
    }
    
    console.log(reverse("10 2 3 U S A")); // returns A S U 3 2 10
    console.log(reverse("2345678910")); // returns 1098765432

Ответ 4

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

Из-за неопределенности вопроса разумно полагать, что система счисления, которую определяет OP, состоит из [2, 3, 4, 5, 6, 7, 8, 9, 10] и всех других символов AZ (включая 0 и 1) просто персонажи.

String.prototype.isNumeric = function() {
  return !isNaN(parseFloat(this)) && isFinite(this);
};

function reverse(str) {
  let tokens = [], len = str.length;
  while (len--) {
    let char = str.charAt(len);
    if (char.isNumeric()) {
      if (len > 0 && str.charAt(len - 1).isNumeric()) {
        let curr = parseInt(char, 10),
            next = parseInt(str.charAt(len - 1), 10);  
        if (curr === 0 && next === 1) {
          tokens.push(10);
          len--;
          continue;
        }
      }
    }
    tokens.push(char);
  }
  return tokens.join('');
}

console.log(reverse("10 2 3 U S A"));
console.log(reverse('2345678910'));

Ответ 5

Ниже приведен рекурсивный подход.

function f(s, i=0){
  if (i == s.length)
    return '';
  if (['0', '1'].includes(s[i])){
    let curr = s[i];
    while (['0', '1'].includes(s[++i]))
      curr += s[i]
    return f(s, i) + curr;
  }
  return f(s, i + 1) + s[i];
}

console.log(f('10 2 3 U S A'));
console.log(f('2345678910'));
console.log(f('USA101001'));

Ответ 6

function split(str) {
  let temp = [];
  temp = str.split(' ');
  const backwards = [];
  const totalItems = str.length - 1;
  for (let i = totalItems; i >= 0; i--) {
    backwards.push(temp[i]);

  }
  return backwards.join(' ').toString();

}
console.log(split("10 2 3 U S A"));

Ответ 7

Хороший вопрос до сих пор.

Вы можете попробовать этот рекурсивный подход (если изменение 10 для другого символа не разрешено):

function reverseKeepTen(str, arr = []) {
	const tenIdx = str.indexOf('10');
  
  if (!str.length) {
  	return arr.join('');
  }
  
  if (tenIdx === -1) {
    return [...str.split('').reverse(), ...arr].join('');
  } else {
  	const digitsBefore = str.slice(0, tenIdx);
    
  	const arrBefore = digitsBefore ? [...digitsBefore.split(''), 10].reverse() : [10];
  	return reverseKeepTen(str.slice(tenIdx + 2), [...arrBefore, ...arr])
  }
};


console.log(reverseKeepTen('101234105678910')) // 109876510432110
console.log(reverseKeepTen('12341056789')) // 98765104321
console.log(reverseKeepTen('1012345')) // 5432110
console.log(reverseKeepTen('5678910')) // 1098765
console.log(reverseKeepTen('10111101')) // 11011110

Ответ 8

Хотел бы я это прокомментировать, но уже не могу.

Вы должны попытаться разделить строку с пробелом:

str.split(' ')

И затем соедините их, соедините все части вместе, таким же образом:

backwards.join(' ').toString();

Ответ 9

этот код работает для всех типов строк с нуля:

function split(str) {
  let temp = [],
      bool = true;
  temp = str.split('');
  var backwards = [],
        zeroBackward = [];
  var totalItems = str.length - 1;
  for (let i = totalItems; i >= 0; i--) {
    if(temp[i] == '0' && i == totalItems) {
      zeroBackward.push(temp[i]);
      totalItems = totalItems -1;
    } else if(temp[i] != '0' && bool) {
      backwards.push(temp[i]);
      backwards = backwards.concat(zeroBackward);
      bool = false;
    } else if(!bool) {
      backwards.push(temp[i]);
    }
  }
  return backwards.join('').toString();

}
console.log(split("10 2 3 U S A"));
console.log(split("2345678910"));
console.log(split("23456789100000"));
console.log(split("234567891000001"));