Как перевернуть строку с числами, но не переставить 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"));