Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

MarinaShortyMarinova avatar MarinaShortyMarinova 12 Точки

Въпрос относно тема Arrays задача Rotate and Sum

http://pastebin.com/exame5YF   Някой може ли да ми помогне с тази задача, стигнала съм до частта, в която трябва последният елемент на входния масив да стане първи , а останалите да се преместят с една позиция надясно (например : вход: 1 2 3 4 5, изход 5 1 2 3 4). Има променлива К , която трябва да показва колко пъти да се направи преместването. Цикълът изпълнява операцията веднъж правилно, а следващите пъти грешно. Разбирам, че грешката най-вероятно е в реда веднага след цикъла, но не знам как да я оправя. Някой може ли да помогне? :)

Тагове:
3
Programming Basics 23/03/2016 15:53:32
Simeon.R avatar Simeon.R 198 Точки
Best Answer

Привет,

Много си близо до решението. Един вариант е във втория цикъл да променяш nums (масива в който са запазени първоначално стойностите), а newNums ще го пълниш с помощта на трети цикъл (който да е също в for (int i = 0; i < k; i++)) като казваш всеки елемент от newNums да ти е равен на += от nums. 

Мисля, че се изразих малко объркващо. Моето решение е http://pastebin.com/Xkg48WHf :)

Пример: при вход 1 2 3 4 5 (3 завъртания) трябва да се получат 3 масива, които да сумираш. Първия масив ще го завъртиш, за да получиш 5 1 2 3 4. Тези стойности можеш направо да ги презапишеш върху входните данни на масива. До тук горе-долу си го направила. Сега в масивът, който си създала (newNums) стойностите ще са 0-ли. Ти искаш стойността на първия елемент в newNums да е равна на стойността на първия елемент на първия масив (в случая 5), но не само да е равна, но и да се увеличава със първата стойност всеки следващ масив (след завъртане надясно) и т.н. (+=.). 

Реално се получава нещо подобно: в най-външния цикъл въртиш от 0 до броя завъртания. В първия вътрешен цикъл изместваш съществуващия масив надясно един път. Във втория вътрешен цикъл добавяш получените стойности в newNums. Надявам се така е по-ясно.

1
23/03/2016 16:49:35
Bratislav avatar Bratislav 0 Точки

Здравейте,

 

когато цикълът мести елементите отдясно наляво, реално взима стойността на последната позиция и я присвоява на препоследната и т.н.

Въпросът ми е каква стойност остава за последната позиция след като тя е преместена на предпоследната.

 

for (int e = array.Length - 1; e > 0; e--)
                {
                    array[e] = array[e - 1];
                }

 

 

0
djc_bg2015 avatar djc_bg2015 923 Точки

ЕДИТ: В примера по - долу съм направил превъртането на масива да е в ляво, но не мисля че ще ти е трудно да обърнеш на дясно.

 

Ето начин да превъртиш масив на дясно ляво:

1. въртиш цикъл до броя на ротациите

2. на всяка итерация, записваш елемента на позиция 0 в temp променлива.

3. въртиш цикъл от 1 до броя на елементите в масива

4. на всяка итерация взимаш елемента на индекс и го сетваш за индекс - 1

5. след приключване на цикъла сетваш послената позиция в масива да е равна на temp.

Добра идея e да въртиш цикъла за ротациите до броя на ротациите модул от броя на елементите, така ако имаш да въртиш масив от 5 елемента 104 пъти , ще направиш само 104 % 5 = 4 ротации.

 

Завъртане на ляво 1234 -> 2341

int[] nums = {1, 2, 3, 4};
int numOfRotations = 3;
for (int i = 0; i < numOfRotations % nums.Length; i++)
{
    int temp = nums[0];
    for (int j = 1; j < nums.Length; j++)
    {
        nums[j - 1] = nums[j];
    }

    nums[nums.Length - 1] = temp;
}

Console.WriteLine(string.Join(", ", nums)); // 4, 1, 2, 3

 

Завъртане на дясно: 1234 -> 4123

int[] nums = {1, 2, 3, 4};
int numOfRotations = 1;
for (int i = 0; i < numOfRotations; i++)
{
    int temp = nums[nums.Length - 1];
    for (int j = nums.Length - 1; j >= 1; j--)
    {
        nums[j] = nums[j - 1];
    }

    nums[0] = temp;
}

 

1
23/03/2016 16:29:57
MarinaShortyMarinova avatar MarinaShortyMarinova 12 Точки

Благодаря ти, но май не е точно това, което търся. Според твоето решение Output-а накрая е 4 1 2 3 , а трябва резултатът да се получи така:

при вход 1 2 3 4 и 3 ротации:

4 1 2 3----> 3 4 1 2---> 2 3 4 1

Твоят цикъл изпълнява това условие само веднъж :) точно както моят цикъл. Освен ако не пропускам нещо. 

1
djc_bg2015 avatar djc_bg2015 923 Точки

Ами не виждам проблем в кода който съм ти пратил.

Завъртанията са коректни :)

 

1 2 3 4 -->

след 1ва ротация на дясно: 4 1 2 3

след 2ра ротация на дясно: 3 4 1 2

след 3та ротация на дясно: 2 3 4 1

(гледаш втория примерен код нали?)

0
23/03/2016 16:28:32
InaPanova avatar InaPanova 28 Точки

MarinaShortyMarinova, права си. Кодът работи за 2 завъртания вместо за 3 - просто на първия цикъл в условието след като получиш остатъка на броя завъртания на дължината на масива трябва да вадиш от този остатък една единица. Иначе решението е много добро.

 

0
MarinaShortyMarinova avatar MarinaShortyMarinova 12 Точки

Благодаря и на двама ви! :)

1
JulySS avatar JulySS 4 Точки

Здравейте,
оставям и моето решение на задачата. Използвал съм ХОR алгоритъм, на който не му е нужна 3-та променлива, за да размени стойностите.
--->> http://pastebin.com/7HKn20Eg
 

1
MarinaShortyMarinova avatar MarinaShortyMarinova 12 Точки

Много интересен начин, благодаря, ще го проуча по-подробно :)

1
jish91 avatar jish91 3 Точки

static void Main(string[] args)
        {
            var nums = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
            var n = int.Parse(Console.ReadLine());

            int[] result = new int[nums.Length];
            for (int i = 0; i < n; i++)
            {
                rotated(nums);
                resultsum(result, nums);
            }
            Console.WriteLine(string.Join(" ", result));
        }
        private static void rotated(int[] nums)
        {
            var value = nums[nums.Length - 1];
            for (int site = nums.Length - 1; site > 0; site--)
            {
                nums[site] = nums[site - 1];
            }
            nums[0] = value;
            return;
        }
        private static void resultsum(int[] result, int[] nums)
        {
            for (int i = 0; i < nums.Length; i++)
            {
                result[i] = result[i] + nums[i];
            }
        }

0
MinchoBalaliev avatar MinchoBalaliev 0 Точки

string input = Console.ReadLine();
            string[] arr =  input.Split(' ');
            int[] myInts = Array.ConvertAll(arr, int.Parse);
            
            //Convert int array to LinkedList
            LinkedList<int> m = new LinkedList<int>(myInts);

            Console.Write("Enter rotation: ");
            int rotation = int.Parse(Console.ReadLine());
            int temp = 0;

            while (rotation > 0)
            {
                temp = m.Last();
                m.RemoveLast();
                m.AddFirst(temp);

                rotation--;
            }

..... От тук нататък e лесно

Не съм ученик от SoftUni обучавам се сам чрез видео уроците на SoftUni, идеята е чрез linkedlist (казвам това защото незнам дали сте изучавали Линейни структури от данни и по точно LinkedList), изгглежда

доста по добре за четене и разбиране да не говирм за скороста.

0
21/11/2016 10:07:11
HunteR avatar HunteR 0 Точки

Ето и едно мое решение. Опитал съм се математически да изчисля кой точно index да бъде взет от масива.

Надявам се на някой да му е полезно. :)

http://pastebin.com/NVa8HJr7

0
ZGirtsova avatar ZGirtsova 2 Точки

Здравей, ето и моето кратко решение с Arrays, както е темата. Използвах формула, която изчислява къде се намира елементът на позиция i след r на брой завъртания.

 

https://pastebin.com/WNQVVQ4w

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