Для разницы цикла между Python и Java - PullRequest
3 голосов
/ 19 апреля 2019

В Python мы делаем цикл вроде:

for i in range(len(nums))

В Java: имеем:

for (int i = 0; i < nums.length; i++)

Являются ли эти два цикла идентичными?Если мы внесли некоторые изменения в цикл for, скажем, в цикле for у меня было плюс 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 && 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поэтому я начал с того, что было добавлено.

В 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 для всего, что я был добавлен, в то время как Python не принимает добавленный i, и всегда запускается для последнего i.

Ответы [ 3 ]

1 голос
/ 19 апреля 2019

В 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 - это именно то, что позволяет получить доступ к текущему значению итерируемого.

1 голос
/ 19 апреля 2019

Циклы for 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
    }
1 голос
/ 19 апреля 2019

Это не работает в 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]
...