javascript 如何获取字符串的中间字符?

gajydyqb  于 2023-02-11  发布在  Java
关注(0)|答案(6)|浏览(318)

我正在接受CodeWars中的形的训练,可以在这里找到https://www.codewars.com/kata/56747fd5cb988479af000028/train/javascript
我无法理解其他的解决方案。我的尝试是:

const getMiddle = (s) => {
  let middle = ""
  for(let i = 0; i < s.length; i++) {
    if(s.length % 2 === 1) {middle = s[s.length-1/2]}
    if(s.length % 2 === 0) {middle = s[s.length-1/2-1] + s[s.length-1/2]}
  } return middle
}
zyfwsgd6

zyfwsgd61#

你把事情弄得太复杂了。
不需要循环,因为长度不依赖于i
不用检查长度是奇数还是偶数,只需除以2并向下舍入即可。

function getMiddle(s) {
    return Math.floor(s.length / 2);
}
ars1skjm

ars1skjm2#

如果s长度为奇数,则s.length / 2将返回floating point中的数字

console.log(5 / 2);
console.log(6 / 2);

必须使用parseInt将其解析为int,或者可以使用快捷方式

(s.length / 2 - 1) | 0
const a = 5 / 2;

console.log(parseInt(a));
console.log(a | 0);
const getMiddle = (s) => {
  let middle = "";

  if (s.length % 2 === 1) middle = [s[(s.length / 2) | 0]];
  else middle = [s[(s.length / 2 - 1) | 0], s[(s.length / 2) | 0]];

  return middle.join("");
};

console.log(getMiddle("A"));
console.log(getMiddle("HELMO"));
console.log(getMiddle("HELLO0"));
wfveoks0

wfveoks03#

不要迭代字母。你可以简单地对evenodd长度的字符串进行迭代。

const getMiddle = (s) => {
  return s[Math.floor(s.length/2)]
}

console.log(getMiddle("abc"));
console.log(getMiddle("abcd"));
console.log(getMiddle("abcde"));
console.log(getMiddle("abcdef"));
console.log(getMiddle("abcdefg"));
ix0qys7i

ix0qys7i4#

您需要计算字符串的pivotlength

const expect = chai.expect;

class Test {
  static assertEquals(actual, expected) {
    return expect(actual).to.equal(expected);
  }
}

function getMiddle(s) {
  const pivot = Math.floor(s.length / 2);
  return s.length < 2
    ? s
    : s.length % 2 === 0
      ? s.substr(pivot - 1, 2)
      : s[pivot];
}

mocha.setup('bdd');

describe('GetMiddle', function() {
  it('Tests', function() {
    Test.assertEquals(getMiddle("test"),"es");
    Test.assertEquals(getMiddle("testing"),"t");
    Test.assertEquals(getMiddle("middle"),"dd");
    Test.assertEquals(getMiddle("A"),"A");
  });
});

mocha.run();
<link href="https://cdnjs.cloudflare.com/ajax/libs/mocha/9.1.1/mocha.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/9.1.1/mocha.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/4.3.4/chai.min.js"></script>
<div id="mocha"></div>
3htmauhk

3htmauhk5#

以下是我的解决方案:

function getMiddle(string) {

  let middle = Math.floor(string.length / 2);

  if (string.length % 2 === 0) {

      return string[middle - 1] + string[middle];
  }
  else{
      return string[middle];
  }
}
bgtovc5b

bgtovc5b6#

我们希望:

// find out if the string is even
// take its two middle characters in case it is
// OR
// if the string is odd, take its middle character

一个字符串是偶数,即使它的长度除以2没有余数:

s.length % 2 === 0

现在,给定这个语句,我们有两个选择,一个是返回两个中间字符,以防字符串实际上是偶数。

s.slice(s.length / 2 - 1, s.length. / 2 + 1)

因为如果一个字符串是偶数,它的中间是虚构的,我们想要的字符是离中间一个字符远的字符。
如果字符串的字符数是奇数,我们就有了一个由一个字符组成的中间字符串。因此,我们可以拉取一个索引。

s[Math.floor(s.length / 2)]

其中s有一个索引,我们通过将字符串长度除以2的值向下舍入到最接近的整数来找到该索引。
因此:

const getMiddle = s => {
  return s.length % 2 === 0
  ? s.slice(s.length / 2 - 1, s.length / 2 + 1)
  : s[Math.floor(s.length / 2)]
}

您也可以将其编写为

const getMiddle = s => s.length % 2 === 0 ? s.slice(s.length / 2 - 1, s.length / 2 + 1) : s[Math.floor(s.length / 2)]

相关问题