Професионална програма
Loading...
+ Нов въпрос
peter_arsov avatar peter_arsov 0 Точки

Condense Array to Number - Tech Fundamentals with Java and PHP

Condense Array to Number
Write a program to read an array of integers and condense them by summing adjacent couples of elements until a
single integer is obtained. For example, if we have 3 elements {2, 10, 3}, we sum the first two and the second two
elements and obtain {2+10, 10+3} = {12, 13}, then we sum again all adjacent elements and obtain {12+13} = {25}.
Examples:

---------------------
Input: 2 10 3

Output: 25

Comments:2 10 3 -> 2+10 10+3 -> 12 13 -> 12 + 13 -> 25

---------------------

Input: 5 0 4 1 2

Output: 35

Comments: 5 0 4 1 2 -> 5+0 0+4 4+1 1+2 ->5 4 5 3 ->5+4 4+5 5+3 ->9 9 8 ->9+9 9+8 ->18 17 ->18+17 ->35

---------------------

Input: 1

Output: 1

Comments:  1 is already condensed to number

------------------------------------------------------------------

Здравейте,

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

Линк с решението ми: https://pastebin.com/QRGvTaaC

 

0
Fundamentals Module 07/02/2019 16:12:39
peter_arsov:
Answer is given.
arjunah avatar arjunah 9 Точки

Здравей, видях няколко неща в кода ти:

1. Тази проверка, и съответно променливата elem, са ти ненужни:

if (intItems[0] == intItems[elem - 1]) {
    System.out.printf("%d is already condensed to number", intItems[0]);
    return;
} 

Първо, защото това, което е като comments в условието на задачата, не трябва да се печата на конзолата - при всички случаи трябва да се отпечата само едно число; второ, самата ти проверка е некоректна: ако имаш вход "2 2" тогава пак ще ти изкара "2 is already condensed to number"

2. Логиката ти за пресмятане на sum е неправилна в случая и не работи за масив с повече от три елемента, защото ти реално прaвиш следното:

sum = (intItems[0] + intItems[1]) + (intItems[1] + intItems[2]) + (intItems[2] + intItems[3]) + ... и т.н.

А всъщност ти трябва това:

sum = (((intItems[0] + intItems[1]) + (intItems[1] + intItems[2])) + ((intItems[1] + intItems[2]) + (intItems[2] + intItems[3]))) +
...и т.н., което е пример за масив с 4 елемента, като за повече става по-дълго и с повече скоби, но се надявам да си схванал логиката :-)

Т.е., след първото събиране трябва да запазваш получените нови елементи, за да ги събираш отново по двойки по същата логика, а не просто да получиш общия им сбор след първото събиране.

Ето моето примерно решение:

public class CondenseArrayToNumber{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] input = Arrays.stream(sc.nextLine().split(" ")).mapToInt(e -> Integer.parseInt(e)).toArray();
        while (input.length > 1) {
            int[] condensed = new int[input.length - 1];
            for (int i = 0; i < condensed.length; i++) {
                condensed[i] = input[i] + input[i + 1];
            }
            input = condensed;
        }
        System.out.println(input[0]);
    }
}

Надяваме се да съм ти бил полезен!

2
05/02/2019 10:51:28
peter_arsov avatar peter_arsov 0 Точки

Благодаря, за подробния отговор!

Не съм сигурен дали разбирам какво прави input = condensed;. 
При всяко приключване на for-цикъла, ако input == 5, а condensed == 4, и ги направим равни,
то нали тогава input ще намалява и while - цикълът ще върти, докато input > 1?

 

0
05/02/2019 11:33:53
arjunah avatar arjunah 9 Точки

Нужно ни е да намаляваме дължината на масива всеки път с 1, защото след всяка итерация елементите на новия масив намаляват с един.

input = condensed кара input[] да сочи към condensed[] в паметта и така input.length става с 1 по-малко всеки път, докато не стане = 2, при което condensed.length = 1 и цикълът прекъсва, понеже ни е нужно само едно число за изход. 

А condensed[input.length - 1], понеже при всяка итерация от събирания елементите на новия масив намаляват с един, докато не остане само един елемент, който да се отпечата на изхода. Затова и не ти е нужна проверка, ако входът е само от едно число.

0
iwanovw avatar iwanovw 7 Точки

Не знам този код как работи на Java , но на PHP не работи. По простата причина, че 

condensed.length = 1

и въртиш цикъла до 1, вместо до 2. Следователо се извършва събирането за първите две числа. Би трябвало да е:

i < input.length - 1 

 

0
05/02/2019 20:46:03