我正在学习随机算法,目前我有一种股票,我必须反转包含数字的字符串,但我不能反转字符串中的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"));
我目前遇到的问题是不反转10。
我在做什么错了?
答案 0 :(得分:14)
您可以将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"));
答案 1 :(得分:4)
您可以使用正则表达式在匹配的数组上reduce
。它比连接字符串的for / loop更为昂贵,但找出它很有趣。
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'));
答案 2 :(得分: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
答案 3 :(得分:1)
您需要一些前提条件才能检查每个字符的值。
由于问题的模糊性,我们有理由相信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'));
输出:
A S U 3 2 10 1098765432
答案 4 :(得分:1)
下面是一种递归方法。
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'));
答案 5 :(得分:0)
到目前为止还不错的问题。
您可以尝试这种递归方法(如果未将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