java - 为什么这个算法在追踪时没有意义?
问题描述
我已经跟踪这段代码很长一段时间了
我明白了。但在某些时候,它对我来说不再有意义。
在name
andtyped
中,位置 0 是同一个字母,因此同时增加 j 和 i ( j++
and i++
)。i = 1,j = 1。
在位置 1,它们不一样,所以只增加 j。我 = 1,j = 2。
在位置 2,它们不一样,所以只增加 j。i = 1,j = 3。这就是我卡住的地方。
为什么在控制台中它也会增加i
(i = 2, j = 3
)?字母不同,仅表示增量j
。有人可以指出我没有看到什么吗?
这是我正在做的 Leetcode 问题https://leetcode.com/problems/long-pressed-name/
这是我的代码:
class Solution {
public String name = "alex";
public String typed = "aaleex";
public boolean isLongPressedName(String name, String typed) {
if(name == null) return false;
if(typed == null) return false;
int i = 0;
int j = 0;
for(;i < name.length() && j < typed.length();) {
if(name.charAt(i) == typed.charAt(j)) {
j++;
i++;
System.out.println("END IF");
} else {
j++;
System.out.println("END ELSE");
}
System.out.println("i => " + i);
System.out.println("j => " + j);
if(i != name.length() && j == typed.length()) {
return false;
}
}
return true;
}
}
控制台输出:
END IF
i => 1
j => 1
END ELSE
i => 1
j => 2
END IF
i => 2
j => 3
END IF
i => 3
j => 4
END ELSE
i => 3
j => 5
END IF
i => 4
j => 6
解决方案
你自己说i
的,没有增加。所以我们仍然会查看 的第一个索引name
:
if(name.charAt(i) == typed.charAt(j))
所以在第三次迭代中,我们name
在第一个索引 ( l
) 和typed
第二个索引 ( l
) 进行比较,它们是相同的,所以我们同时递增i
和j
或者将其可视化:
alex //i == 0
^
aaleex //j == 0
^
两者都是相同的,所以都增加:
alex //i == 1
^
aaleex //j == 1
^
它们不是,所以只有第二个增加:
alex //i == 1
^
aaleex //j == 2
^
现在它们指向同一个字母,所以两者都再次递增
alex //i == 2
^
aaleex //j == 3
^
两者相同,都递增
alex //i == 3
^
aaleex //j == 4
^
不一样,只是j
增加了
alex //i == 3
^
aaleex //j == 5
^
两者都一样,但我们已经走到了尽头String
推荐阅读
- python - Python:any() / all() 中的惰性函数求值
- prolog - 有没有办法使用!序言中的运算符仅在序言中使用谓词?
- python - 在类中打开转换为字典的 JSON 文件
- python - 迁移不适用于特定模型
- mobile - 是否可以将条件操作嵌入到条形码中
- java - 如何在 Java 中运行程序后保持 GUI 运行
- javascript - 有没有办法用硒关闭选择文件窗口?
- java - 迭代 ImmutableMap.copyof() 时出现 ConcurrentModificationException
- angular - Azure 部署的 SPA 应用程序注册重定向 url 提供资源不可用
- git - 如何使用 git 我可以知道“刚刚发生推送”到主分支?