Професионална програма
Loading...
+ Нов въпрос
YavorSpassov+deleted! avatar YavorSpassov+deleted! 133 Точки

A question on 2. Rotate and Sum from Exercises: Arrays

Problem
Solution

Няма проблем със самото решение, защото дава 100%, но все пак не разбирам един ред код, който добавих, за да работи то, а именно ред 20:
 

rotated = new int[nums.Length];  

Защо е необходимо повторно да инициализирам масива rotated и защо без тази инициализация програмата не работи? surprise

0
Programming Fundamentals
vancho avatar vancho 430 Точки

Може да го инициализираш само вътре в while-a, отвън никъде не се използва.

 

            int[] nums = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int rotations = int.Parse(Console.ReadLine());
            int[] arrSum = new int[nums.Length];
 
            while (rotations > 0)
            {
                int[] rotated = new int[nums.Length];                
                rotated[0] = nums[nums.Length - 1];
                arrSum[0] += rotated[0];
                for (int i = 1; i < nums.Length; i++)
                {
                        rotated[i] = nums[i - 1];
                        arrSum[i] += rotated[i];
                }
                rotations--;
                nums = rotated;
            }
 
            Console.WriteLine(string.Join(" ", arrSum));

-1
17/08/2016 17:46:47
YavorSpassov+deleted! avatar YavorSpassov+deleted! 133 Точки

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

0
vancho avatar vancho 430 Точки

Ти ли си писал този код. Ако не си, разбирам но не съвсем защо не схващаш. Няма смисъл от двете инициализации. По-горе съм ти показал как да го направиш.

-1
17/08/2016 18:02:27
YavorSpassov+deleted! avatar YavorSpassov+deleted! 133 Точки

Аз съм го писал и зададох конкретен въпрос.

0
YavorSpassov+deleted! avatar YavorSpassov+deleted! 133 Точки

Алтернативен вариант със списък:
 

        List<int> nums = Console.ReadLine().Split().Select(int.Parse).ToList();
        int k = int.Parse(Console.ReadLine());
        List<int> sumArr = new List<int>();
        for (int i = 0; i < nums.Count; i++) sumArr.Add(0);

        while (k > 0)
        {
            int temp = nums[nums.Count - 1];
            nums.RemoveAt(nums.Count - 1);
            nums.Insert(0, temp);
            for (int i = 0; i < nums.Count; i++) sumArr[i] += nums[i];
            k--;
        }

        Console.WriteLine(string.Join(" ", sumArr));

 

0
Alex0101 avatar Alex0101 374 Точки

Според мен е свързано с присвояването на един масив върху друг. Като го присвояваш ти казваш просто, че нъмс започва да сочи към паметта, където ротейтед е пазило данните си. След това инициализираш ротейтед и той започва да сочи към ново място. С всяко инициализиране той се изчиства и се декларира нов чист.

 Реално не е добра практика, според мен, аз бих до направил с някакво copy и след това clear на rotated.

Не съм 100% сигурен, че отговорът ми е релевантен, а и няма как да тествам идейте си, защото , поради някаква причина е заключен джъджа...

0
YavorSpassov+deleted! avatar YavorSpassov+deleted! 133 Точки

Не е заключен. Преди малко събмитнах решението. Иначе темата я обсъждахме преди месец. Сега само добавих алтернативно решение.

0