java - Python和Java的for循环区别
问题描述
在 Python 中,我们执行 for 循环,例如:
for i in range(len(nums))
在java中:我们有:
for (int i = 0; i < nums.length; i++)
这两个for循环是否相同?如果我们在 for 循环中进行了一些更改,假设在 for 循环中 i 已加 3,对于 Java,for 循环中的下一个 i 将是 4?而 Python 仍然从 2 开始
Leetcode 594. 最长和谐子序列。
我们将和谐数组定义为最大值与最小值之差正好为 1 的数组
用Java编写的解决方案如下:
nums=[1,3,2,2,5,2,3,7]
public class Solution {
public int findLHS(int[] nums) {
Arrays.sort(nums);
int prev_count = 1, res = 0;
for (int i = 0; i < nums.length; i++) {
int count = 1;
if (i > 0 && nums[i] - nums[i - 1] == 1) {
while (i < nums.length - 1 && nums[i] == nums[i + 1]) {
count++;
i++;
}
res = Math.max(res, count + prev_count);
prev_count = count;
} else {
while (i < nums.length - 1 && nums[i] == nums[i + 1]) {
count++;
i++;
}
prev_count = count;
}
}
return res;
}
}
我转换为 Python:
nums=[1,3,2,2,5,2,3,7]
nums=sorted(nums)
prev_count=1
res=0
i=0
for i in range(len(nums)-1):
count=1
if i>0 and nums[i]-nums[i-1]==1:
while i<len(nums)-1 and nums[i] == nums[i+1]:
count+=1
i+=1
res=max(res,count+prev_count)
prev_count=count
else:
while i<len(nums)-1 and nums[i] == nums[i+1]:
count+=1
i+=1
prev_count=count
print (res)
在 Java 中
for (int i = 0; i < nums.length; i++) {
int count = 1;
if (i > 0 && nums[i] - nums[i - 1] == 1) {
while (i < nums.length - 1 && nums[i] == nums[i + 1]) {
count++;
i++;
}
i++ 在 for 循环中,所以 i 从添加的任何内容开始。
在 Python 中:
for i in range(len(nums)-1):
count=1
if i>0 and nums[i]-nums[i-1]==1:
while i<len(nums)-1 and nums[i] == nums[i+1]:
count+=1
i+=1
在 i+=1 之后,它只适用于 While 循环,for 循环仍然从 i=2 而不是 4 开始。
当 python 为 4 时,Java 返回答案为 5。我调试代码,看起来 Java 开始 i 为任何 i 添加,而 Python 没有添加 i 并且总是从最后一个 i 开始。
解决方案
在 java 中,for 循环语义是从 C 中借用的。
for (<initilization>; <termination condition>; <what to do in after each iteration>)
在开始时做一些事情(初始化),然后直到达到某个条件(终止条件),做一些事情以取得进展(每次迭代后要做什么)。惯用的 for 循环 withi
有效,因为迭代的状态保持在i
. 因此,如果您i
对循环体进行更改,迭代的状态也会发生变化。
python 语法类似于bash
循环:
for i in some_iterable:
这里i
接受来自 的每个值,some_iterable
并且循环对 的每个值运行一次i
。如果你i
在循环体内改变,没关系;i
在下一次迭代期间从可迭代对象中分配下一个值。循环的状态保持在可迭代对象中,而不是i
. i
正是让您访问可迭代的当前值的原因。
推荐阅读
- android - Android测试一个函数正在被滚动调用
- excel - 使用 Selenium 在手动打开的浏览器窗口上执行
- javascript - 获取 TypeError:o 不是 trsetState 的函数
- javascript - 我如何在 apollo 中使用 graphQL 模拟连接以进行测试?
- varnish - 清漆丢失和重新获取日志 - 连接断开
- reactjs - 如何防止 Tailwind 在聚焦时更改文本输入字段的边框?
- php - 从 SFTP 打开 csv 文件并将文件内容提取到 php 数组中
- javascript - 异步 thunk 模式
- python - 如何在 Python 中使用 str.replace() 函数将地址替换为只有数字和一些字母?
- flutter - Flutter 和 GetX:如何更新我的列表
在我看来?