按字母顺序取消连续字符的资格。 Sol [ASCII格式]

时间:2019-01-06 11:06:16

标签: javascript arrays string data-manipulation

我的朋友给我这个问题。该问题要求从给定的字符串输入中删除所有字母连续的字符。 因此,我使用Java语言完成了此操作,如果我执行得当,则需要专家的帮助。

我认为使用Array.prototype.reduce是最好的方法,我们还有其他可能的方法吗?

/**
 * @author Abhishek Mittal <abhishekmittaloffice@gmail.com>
 * @description function can deal with both any types followed in a consecutive manner in ASCII Chart.
 * @param {string} str 
 */
function improvise(str) {
    // Backup for original input.
    const bck = str || '';
    const bckArr = bck.split('').map( e => e.charCodeAt(0)); // converting the alphabets into its ASCII for simplicity and reducing the mayhem.

    let result = bckArr.reduce( (acc, n) => {
            // Setting up flag
            let flag1 = n - acc.rand[acc.rand.length - 1];
            let flag2 = n - acc.temp;

            if(flag1 === 1 || flag2 === 1) {
                (flag2 !== NaN && flag2 !== 1) ? acc.rand.pop() : null; // update the latest value with according to the case.
                acc.temp = n
            }else{
                acc.rand.push(n); // updating the random to latest state.
                acc.temp = null;
            }

        return acc;

    }, {rand: [], temp: null} /* setting up accumulative situation of the desired result */) 

    result = result.rand.map(e => String.fromCharCode(e)).join('')
    return result ? result : '' ;
}

function init() {
    const str = "ab145c";
    const final = improvise(str);
    console.log(final)
}
init();

嗯,输出结果正确无误。 输入:ab145c 输出:1c

2 个答案:

答案 0 :(得分:1)

不幸的是,没有办法使用任何远程合理的正则表达式来解决这个问题。

我认为使用.filter会更清楚,并检查下一个字符还是上一个字符是连续的:

const code = char => char
? char.charCodeAt(0)
: -2; // will not be === to any other codes after addition or subtraction
  
function improvise(str) {
  return [...str]
    .filter((char, i) => {
      const thisCode = code(char);
      return (
        thisCode !== code(str[i - 1]) + 1
        && thisCode !== code(str[i + 1]) - 1
      );
    })
    .join('');
}

console.log(improvise('ab145c'));

(或者,您可以仅检查 下一个字符是否连续,但是随后您还必须检查字符串中最后一个字符的有效性)

如果需要连续替换个字符,直到没有连续的字符剩余,请继续调用improvise

const code = char => char
? char.charCodeAt(0)
: -2; // will not be === to any other codes after addition or subtraction
  
function improvise(str) {
  return [...str]
    .filter((char, i) => {
      const thisCode = code(char);
      return (
        thisCode !== code(str[i - 1]) + 1
        && thisCode !== code(str[i + 1]) - 1
      );
    })
    .join('');
}

let result = 'hishakmitalaaaaabbbbbbcccccclmnojqyz';
let same = false;
while (!same) {
  const newResult = improvise(result);
  if (newResult !== result) {
    result = newResult;
    console.log(result);
  } else {
    same = true;
  }
}
console.log('FINAL:', result);

答案 1 :(得分:0)

好吧,这是很棒的代码,但没有给出解决问题的确切方法,请参阅:

INPUT: hishakmitalaaaaabbbbbbcccccclmnojqyz

我知道了

Output: shakmitalaaaabbbbcccccjq

您会看到'ab'和'bc'保持不变,我们需要增加循环数,也许要检查这些循环,这也会增加复杂性。 但是,我的解决方案也不能给我我想要的答案,例如对于上面的字符串我应该得到

  

ishakmitalaacccjq

但是我的解决方案给出了

  

shakmitalcccccjq

希望您能理解这个问题。我们需要改变遍历整个字符串的方式。