我正在对 CodeWars 的 kata 进行训练,可以在这里找到 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
}
你让事情变得比需要的更加复杂。
您不需要循环,因为长度不依赖于
i
。
您可以除以 2 并向下舍入,而不是检查长度是奇数还是偶数。
function getMiddle(s) {
return Math.floor(s.length / 2);
}
s.length / 2
长度为奇数,
floating point
将返回 s
中的数字
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"));
不要重复字母。您可以简单地对
even
和 odd
长度的字符串执行此操作。
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"));
您需要计算字符串的
pivot
和 length
。
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>
这是我的解决方案:
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];
}
}
我们希望:
// 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
一个字符串是偶数,如果它的长度除以二没有余数:
s.length % 2 === 0
现在,鉴于此声明,我们有两个选择。一种是返回两个中间字符,以防字符串实际上是偶数。
s.slice(s.length / 2 - 1, s.length. / 2 + 1)
因为如果一个字符串是偶数,那么它的中间是虚数,而我们想要的字符距离这个中间只有一个字符。
如果字符串的字符数为奇数,则我们有一个由一个字符组成的实际中间。因此,有一个索引我们可以拉。
s[Math.floor(s.length / 2)]
其中 s 有一个索引,我们通过将字符串长度除以二的值向下舍入到最接近的整数来找到该索引。
所以:
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)]
public void findMiddleLetterInString(){
String name="middleLetter" ;
int middleLetter;
int i;
for( i=0;i<name.length();i++){
char stringtochar=name.charAt(i);
middleLetter=name.length()/2;
if(i==middleLetter) {
System.out.println(stringtochar);
System.out.println(middleLetter);
}
}
}
所以,按照问题中的指示,我有这个建议,你可以尝试一下,它对我有用:
function getMiddle(s) {
if (s.length < 2) {
return s;
}
if (s.length % 2) {
for (let i = 0; i < s.length; i++) {
if (i == (s.length - 1) / 2) {
return s[i];
}
}
} else {
for (let i = 0; i < s.length; i++) {
if (i == s.length / 2) {
return s[i - 1] + s[i];
}
}
}
}
这里我们检查奇数和偶数长度,你可能知道如果是奇数我们只返回中间值,但对于偶数我们必须返回 2 个中间值