代码之家  ›  专栏  ›  技术社区  ›  user8107351

如何使用数字反转字符串,但不反转1和0?[闭门]

  •  12
  • user8107351  · 技术社区  · 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"));
    console.log(split("2345678910"));

    我现在有一个问题,就是不能逆转10。

    我做错了什么?

    6 回复  |  直到 6 年前
        1
  •  14
  •   OmG    6 年前

    你可以替换 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
  •  4
  •   Andy    6 年前

    你可以 reduce

    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
  •  3
  •   Pac0    6 年前

    只需查看特殊情况&对正常逻辑进行编码,或像往常一样反转

        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
  •  1
  •   Mr. Polywhirl    6 年前

    您需要一些先决条件来检查每个字符的值。

    由于问题的模糊性,有理由相信OP定义的数字系统由[2,3,4,5,6,7,8,9,10]组成,所有其他字符A-Z(包括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
    
        5
  •  1
  •   elena a    6 年前

    下面是一个递归方法。

    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
  •  0
  •   Shevchenko Viktor    6 年前

    到目前为止,这个问题问得不错。

    您可以尝试这种递归方法(如果不允许为其他字符更改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