为您提供两个字符串。一键移动,您可以选择其中任意一个,然后删除第一个(即最左边的)字符。
例如:
通过将移动应用于字符串“ where”,结果是字符串“ here”。 通过对字符串“ a”进行移动,结果为空字符串“”。 实现一个函数,该函数计算使给定字符串相等时应执行的最小移动次数。
注意:
两个字符串均由小写拉丁字母组成。 如果该字符串已经为空,则无法再执行删除操作。
我的问题是,我假设您需要遍历两个字符串以继续比较它们是否相等。如果它们不相等,请增加计数器并再次循环。
但是我不确定我是否一次正确地遍历两个字符串。
i < (s.length, t.length);
的语法正确吗?
这是我尝试过的:
function shiftLeft(s, t) {
let sArray = s.split("");
let tArray = t.split("");
let counter = 0;
for (let i = 0; i < Math.min(s.length, t.length); i++) {
if (s === t) {
return counter;
}
if (s !== t && s.length > t.length) {
sArray.shift("");
counter += 1;
}
if (s !== t && t.length > s.length) {
tArray.shift("");
counter += 1;
}
if (s !== t && t.length === s.length) {
sArray.shift("");
tArray.shift("");
counter += 1;
}
}
return counter;
}
console.log(shiftLeft("west", "test"));
但是它给了我有关测试的错误值-"test"
和"west"
的计数器只能等于2,并且返回4。
我的逻辑错了吗?或者是for循环的语法?还是两者都有?
答案 0 :(得分:3)
代码存在的问题是,在每次迭代结束时,您将更新sArray
和tArray
,而不更新s
和t
。
然后,在下一次迭代中,您将检查s和t是否相等,除非从一开始它们就相等,否则将永远不是这种情况。
因此,您还应该同时更新s
和t
。
此外,在代码的这一部分:
if (s !== t && t.length === s.length) {
sArray.shift("");
tArray.shift("");
counter += 1;
}
计数器不应该加2吗? (我认为这是两个步骤,但这取决于您)。
另外,使用s = s.substring(1);
删除第一个字符比处理数组要难得多...
以下是使用您自己的逻辑的代码段,但解决了我上面提到的内容。希望这会有所帮助!
function shiftLeft(s, t) {
let counter = 0;
while(Math.min(s.length, t.length) > 0) {
if (s === t) {
return counter;
}
if (s !== t && s.length > t.length) {
s = s.substring(1);
counter += 1;
}
if (s !== t && t.length > s.length) {
t = t.substring(1);
counter += 1;
}
if (s !== t && t.length === s.length) {
s = s.substring(1);
t = t.substring(1);
counter += 2; //shouldn't this be 2 instead of 1?
}
}
return counter;
}
console.log(shiftLeft("test", "yes"));
编辑:事实证明您的for循环条件不正确。计数器i
继续增加,而Math.min(s.length, t.length)
不断减少并接近于零,因此循环将过早停止。我们想要的真正逻辑是不断循环直到其中一个字符串为空。