#java #python-3.x
#java #python-3.x
Вопрос:
В Python мы делаем для цикла, как:
for i in range(len(nums))
В Java:
у нас есть:
for (int i = 0; i < nums.length; i )
Идентичны ли эти два цикла for? Если мы внесли некоторые изменения в цикл for, скажем, в цикле for i было плюс 3, для Java, следующий i в цикле for будет 4? в то время как Python все еще запускается i с 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 amp;amp; nums[i] - nums[i - 1] == 1) {
while (i < nums.length - 1 amp;amp; nums[i] == nums[i 1]) {
count ;
i ;
}
res = Math.max(res, count prev_count);
prev_count = count;
} else {
while (i < nums.length - 1 amp;amp; 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 amp;amp; nums[i] - nums[i - 1] == 1) {
while (i < nums.length - 1 amp;amp; nums[i] == nums[i 1]) {
count ;
i ;
}
я внутри цикла for, поэтому я начал с того, что было добавлено.
В 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, поскольку цикл по-прежнему начинается с i = 2, а не с 4.
Java возвращает ответ как 5, в то время как python равен 4. Я отлаживаю код и, похоже, Java запускает i для всего, что было добавлено i, в то время как Python не добавлял добавленный i и всегда начинал с последнего i.
Ответ №1:
В java семантика цикла for заимствована из C.
for (<initilization>; <termination condition>; <what to do in after each iteration>)
Сделайте что-нибудь в начале (инициализация), после этого, пока не будет достигнуто какое-либо условие (условие завершения), сделайте что-нибудь, чтобы добиться прогресса (что делать после каждой итерации). Идиоматический цикл for с i
работает, потому что состояние итерации поддерживается внутри i
. Поэтому, если вы вносите изменения i
в тело цикла, состояние итерации также изменяется.
Синтаксис python похож на bash
циклы:
for i in some_iterable:
Здесь i
принимает каждое из значений из some_iterable
и цикл выполняется один раз для каждого значения i
. Если вы изменяете i
внутри тела цикла, не имеет значения; i
присваивается следующее значение из итерируемого во время следующей итерации. Состояние цикла поддерживается в итеративном, а не i
. i
это как раз то, что позволяет вам получить доступ к текущему значению итерируемого.
Ответ №2:
Циклы Python по сути такие же, как и расширенные циклы Java. Для вашего примера, поскольку range(len(nums))
возвращает [0, 1, 2, ...]
, эти два более или менее эквивалентны:
Python:
array = [0, 1, 2, 3, 4, 5, 6]
for i in array:
// i represents each item in the array
Java:
int[] array = {0, 1, 2, 3, 4, 5, 6};
for (int i : array) {
// i represents each item in the array
}
Ответ №3:
Это не работает в python — i
«сбрасывается» каждый раз, когда возвращается к for i in .... :
for i in range(20) :
print(i) # prints i
i = 99 # has no influence over the next iterations i
print(i) # prints (i 99)
Способ решить это в python был бы:
from collections import Counter
nums=[1,3,2,2,5,2,3,7]
c = Counter(nums)
# create possible keys from c that are 1 apart
one_apart_keys = [ (a, a 1) for a in c if a 1 in c]
# get the key that has the max value of counts
# will pick first one if multiple equals possible
max_key = max(one_apart_keys, key = lambda x: c[x[0]] c[x[1]])
# get all the numbers in order from list
collec = [x for x in nums if x in max_key]
print(collec)
# c is Counter({2: 3, 3: 2, 1: 1, 5: 1, 7: 1})
# one_apart_keys is [(1, 2), (2, 3)]
# max_key is (2, 3)
Вывод:
[3, 2, 2, 2, 3]