我有
function remove(s) {
for (i = 0; i < s.length; i++) {
let lastChar = s.slice(-1);
if (lastChar === "!") {
s = s.substring(0, s.length - 1);
}
else {
return s;
}
}
return s;
}
这通过了105个测试,但在codewars上没有通过1个测试。
失败的测试是:
Expected: '\'isl\'', instead got: '\'isl!\''
表示何时(s)为"isl!!!!!"
在这种情况下,我不知道为什么没有删除字符串中的最后一个字符。
这应该在字符串!
时删除字符串中的最后一个字符:
if (lastChar === "!") {
s = s.substring(0, s.length - 1);
}
我也尝试过:
s = s.replace("!", "");
但结果相同。有什么想法吗?
答案 0 :(得分:3)
因为您要增加i
并在每个循环中检查i < s.length
。有时,您删除了!
(因此缩短了字符串),并且i
等于s.length
,并且您从不检查最后一个字符。
根本没有理由i
。 (或者是for
循环,但是如果这是挑战中的要求...)
如果使用调试器逐步调试它,则会看到问题。使用console.log
的该版本也显示了问题:
function remove(s) {
for (i = 0; i < s.length; i++) {
let lastChar = s.slice(-1);
if (lastChar === "!") {
s = s.substring(0, s.length - 1);
console.log(`i = ${i}, s = '${s}', s.substring(i) = '${s.substring(i)}'`);
}
else {
console.log(`returning '${s}'`);
return s;
}
}
console.log(`returning '${s}' at end, because ${i} >= ${s.length}`);
return s;
}
remove("isl!!!!!");
.as-console-wrapper {
max-height: 100% !important;
}
答案 1 :(得分:1)
您可以在不使用for循环的情况下执行此操作。
const stringRemover (str) => {
if (str[str.length-1] === "!") {
return str.slice(0,str.length-1);
} else {
return str;
}
}
答案 2 :(得分:1)
您可以创建一个递归函数,并使用CharAt
检查最后一个字符是否为!
。如果是这样,则再次调用相同的函数,但要使用删除最后一个!
如果需要最后一个字符,则不确定为什么需要for
function remove(str) {
let getLastChar = str.charAt(str.length - 1);
if (getLastChar === '!') {
return remove(str.substring(0, str.length - 1))
} else {
return str;
}
}
console.log(remove("isl!!!!!"));
这是密码战的结果
答案 3 :(得分:0)
如上一个答复中所述,在i < s.length
循环的每次迭代中都检查for
。
试试这个:
function remove(s) {
let a = s.length;
for (i = 0; i < a; i++) {
let lastChar = s.slice(-1);
if (lastChar === "!") {
s = s.substring(0, s.length - 1);
}
else {
return s;
}
}
return s;
}
答案 4 :(得分:0)
@ T.J。 Crowder向我指出了正确的方向,但他没有提供符合我原始逻辑的答案(在这种情况下,我想使用for循环)。
关键要点在于,s = s.replace("!", "");
在i--
时有效,而s = s.replace(/!+$/g, '')
在i++
时有效。因为据我所知,replace()方法仅替换字符串的第一次出现,因此我们需要i--
来强制循环向后遍历字符串,从而确保每次出现"!"
中的替换。
即这将起作用:
function remove(s) {
for (i = 0; i < s.length; i--) {
let lastChar = s.slice(-1);
if (lastChar === "!") {
s = s.replace("!", '')
}
else {
return s;
}
}
return s;
}
这也将起作用:
function remove(s) {
for (i = 0; i < s.length; i++) {
let lastChar = s.slice(-1);
if (lastChar === "!") {
s = s.replace(/!+$/g, '');
}
else {
return s;
}
}
return s;
}