繁体   English   中英

如何在反向后查找未更改 position 的字符串的字符

[英]How to find characters of a string that did not changed position after resverse

我想知道如何打印在 JavaScript 中反转该字符串后不会更改其 position 的字符串的字符数。

有什么办法吗?

数据 stream - alphxxdida 反向adidaxxhpla之后。 所以这里 x 和 a 没有改变它 position。 我怎样才能做到这一点?

输入 - alphxxdida

输出 4

如果“镜像”position 中的字符是相同的字符,则字符在反转时不会改变。 距离字符串开头n位置的字符的“镜像”position 是距离字符串结尾n位置的字符。

 let mirroredChars = str => { let result = []; let halfLen = Math.ceil(str.length / 2); let lastIndex = str.length - 1; for (let i = 0; i < halfLen; i++) { if (str[i] === str[lastIndex - i]) result.push(str[i]); } return result; }; console.log(mirroredChars('alphxxdida'));

计数实际上有点不直观。 我们不能简单地取2 * mirroredChars(...).length ,因为这意味着镜像字符的数量总是偶数(并且在任何奇数长度的输入字符串中都可能出现奇数,因为中间字符总是可以被视为镜像)。

计数将是:

let countMirroredChars = str => {
  let numMirrored = mirroredChars(str).length;
  return (str.length % 2) // "Is the input string of odd length?"
    ? (numMirrored * 2 - 1)
    : (numMirrored * 2);
};

我们可以使用按位技巧来缩短此代码。 以下任一工作(第二个应该提供更好的性能,但看起来有点神秘):

let countMirroredChars = str => mirroredChars(str).length * 2 - str.length % 2;
let countMirroredChars = str => mirroredChars(str).length * 2 - str.length & 1;

您可以过滤字符串的字符,并与反转字符串中相应索引处的字符进行比较。 过滤后的数组的长度将是保持不变的字符数。

 var str = "alphxxdida"; var reversed = [...str].reverse().join(''); const same = [...str].filter((char,i)=>char===reversed[i]); console.log(same.length);

当然,您实际上并不需要反转字符串来执行过滤器,因为您可以计算镜像字符的索引。

 var str = "alphxxdida"; var same = [...str].filter((char,i)=>char===str[str.length - i - 1]); console.log(same.length);

这里是reduce 遍历到字符串的一半长度并比较字符串两端的字符和计数。

更新:正如@Gershom 指出的那样,固定为奇数长度的字符串工作。

 const getCount = (str) => [...str.slice(0, str.length / 2)].reduce( (acc, char, i) => acc + (char === str[str.length - 1 - i]? 2: 0), str.length % 2 ); var str = "alphxxdida"; var str2 = "alphxdida"; console.log(str, getCount(str)); console.log(str2, getCount(str2));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM