[英]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.