Loading...
dZf1aeA-KlimentHristov avatar dZf1aeA-KlimentHristov 56 Точки

Задача 06.Equal Arrays - от Fundamentals module

Здравейте,

немога да разбера, каде ми е грешката в тази задача, уж открих логиката но ми дава 80 точки.

Може ли малко повече разяснение по нея. Благодаря Ви.

package com.company;

import java.lang.reflect.Array;
import java.util.Scanner;

public class EqualArrays {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        String[] firstArray = scan.nextLine().split(" ");
        int[] numberFirst = new int[firstArray.length];

        String[] secondArray = scan.nextLine().split(" ");
        int[] numberSecond = new int[secondArray.length];

        int sumFirst = 0;
        int diffrent = 0;
        int position = 0;

        for (int i = 0; i < firstArray.length; i++) {
            numberFirst[i] = Integer.parseInt(firstArray[i]);
            numberSecond[i] = Integer.parseInt(secondArray[i]);
            if (numberFirst[i] != numberSecond[i]){
                diffrent++;
                position = numberFirst[i] -diffrent;
            }
            sumFirst += numberFirst[i];
        }

        if (diffrent == 0){
            System.out.printf("Arrays are identical. Sum: %d",sumFirst);
        }else {
            System.out.printf("Arrays are not identical. Found difference at %d index.",position);
        }
    }
}

 

Тагове:
0
Java Fundamentals
MartinBG avatar MartinBG 4803 Точки

Не изчисляваш правилно индекса, на който се открива първата разлика.

Промени:

            if (numberFirst[i] != numberSecond[i]){
                diffrent++;
                position = numberFirst[i] -diffrent;
            }

На:

            if (numberFirst[i] != numberSecond[i]) {
                diffrent++; // това може да е boolean вместо int
                position = i; // i е индекса, на който се намира разликата
                break; // прекъсваме цикъла, защото ни интересува първата разлика
            }

 

____________

Ето едно решение, което използва неща, които още не сте учили (Stream API), но ще ти е полезно да видиш и по-съвременен подход (for циклите от много години са заменени от по-практични конструкции във всички модерни езици):

import java.util.Arrays;
import java.util.Scanner;
import java.util.stream.IntStream;

public class EqualArrays {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        int[] firstArray = getIntArrayFromString(scan.nextLine());
        int[] secondArray = getIntArrayFromString(scan.nextLine());

        String output = IntStream
                .range(0, firstArray.length)
                .filter(index -> firstArray[index] != secondArray[index])
                .mapToObj(index -> String.format(
                        "Arrays are not identical. Found difference at %d index.",
                        index))
                .findFirst()
                .orElse(String.format(
                        "Arrays are identical. Sum: %d",
                        Arrays.stream(firstArray).sum()));

        System.out.println(output);
    }

    private static int[] getIntArrayFromString(String str) {
        return Arrays.stream(str.trim().split("\\s+"))
                .mapToInt(Integer::parseInt)
                .toArray();
    }
}

 

1
13/04/2020 23:55:24
svephoto avatar svephoto 1191 Точки

Колегата ти го е дал доста добре описано и с нови полезни неща.

Друг вариант е леко да си рефакторираш твоя код и да махнеш

        int diffrent = 0;
        int position = 0;

- не са ти нужни.

След това да сложиш sumFirst += numberFirst[i]; преди проверката

if (numberFirst[i] != numberSecond[i]) { }

и вътре в нея да си пуснеш печатането на случая, в който масивите не са идентични (тук position просто го заместваш с i), като след това обаче трябва да прекратиш изпълнението на програмата с един return. А печатането на стринга при случая, в който масивите са идентични го оставяш само него накрая без никакви проверки и си готов.

0
14/04/2020 00:09:17
dZf1aeA-KlimentHristov avatar dZf1aeA-KlimentHristov 56 Точки

Поправих само и-то и аз не брейквах, а е трябвало да брейкна при първия.

 

Благодаря колега.

0
dZf1aeA-KlimentHristov avatar dZf1aeA-KlimentHristov 56 Точки

Колега,  като я решавах вчера задачата не го виждах по този начин решението, малко по подробно пиша задачите все още и не съм мастер де :) Но всеки следващ път се опитвам за по кратки решения и по малко описания.

Благодаря ти.

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.