Loading...

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

zk4acid avatar zk4acid 0 Точки

[Homework] Advanced C# - Arrays, Lists, Stacks, Queues - Въпрос за задача 5

Здравейте.

Проблема при мен е, че нямам идея как да изпринтя последният елемент от последната нарастваща редица. Като цяло и начина ми се струва малко абсурден, но по добър не можах да измисля. Това е без момента за намирането на най - дългата редица. Също се чудя как при if - a да не изключвам последния елемент, т.е когато вече numbers[i+1]<numbers[i] все пак да отпечатам и numbers[i+1]. Затова съм и изнесъл след else-а един console.write. Ако някой може да ми предложи цялостно решение на задачата за да го разгледам ще му бъда много благодарен

class Program
    {
        static void Main()
        {
           int currentidex = 0;
            int[] numbers = Console.ReadLine().Trim().Split().Select(int.Parse).ToArray();
            for (int i=currentidex; i<numbers.Length-1;i++)
            {
                if (numbers[i] < numbers[i + 1])
                {
                    Console.Write("{0}", numbers[i]);
                }
                else
                    Console.WriteLine(numbers[i]);
                currentidex = i + 1;
                continue;
                
            }
        }
    }
}

 

Тагове:
0
Fundamentals Module 16/09/2015 16:47:05
Rextor92 avatar Rextor92 149 Точки
Best Answer

Според мен има два варианта. Един е да започнеш от втория елемент на масива ( numbers[1] ) и да проверяваш if ( numbers[i] > numbers[i-1] ). Плюс една допълнителна проверка, ако има започваща редица от първия елемент.

 

Втория вариант, по който мисля аз да поема, е да проверявам елементите на масива един по един и да ги добавям в лист. Ако стигна до елемент, който не е по-голям от предишния, ще копирам всичко в нов списък и ще изтрия всички елементи на първия. Всеки следващ път, преди да изчиствя myList2 и да прехвърля елементите от myList1 към myList2 ще проверявам дали myList1.Count > myList2.Count.


Това е на пръв поглед. След малко ще стигна до задачата и ще я напиша, евентуално до 30-40 минути ще си едитна коментара с пълно решение, но опитай сам по втория начин! :)​

Едит: Решението на колегата​ Willbe.S ​, такава ми беше идеята.

2
16/09/2015 17:08:21
Willbe.S avatar Willbe.S 5 Точки

Здравей, това е моето решение на 5-та задача. Сигурно има и по-оптимизиран вариант, но работи с тестовете и това ми стига :)

http://pastebin.com/GxkuXgPe

2
cap7ainjack avatar cap7ainjack 20 Точки

Здравейте!

Това тук е за най-дългият стринг, взето от 4та задачи лесно може да се промени за тази. Какво мислите?

Има дефект, но идеята се разбира (При input "8 9 9 9 10" - показва че най-дългата поредица е  9 9 9, но ако добавя още числа ги показва и тях), не съм го хванал още

using System;
using System.Collections.Generic;
                    
   
 string[] input = Console.ReadLine().Split(' ');
            
        int temp = 0;
        int longest=0;
        List<string> list = new List<string>();
        int counter = 0;
        
        int count = 0;
        for (int i = 0; i < input.Length - 1; i++)
        {
            if (input[i] == input[i + 1])
            {
                Console.Write(input[i] + " ");
                temp++;
            }
            else
            {
                Console.WriteLine(input[i] + " ");
            }
            count = i;
            
            if (temp > longest)
            {
                longest = temp;
                list.Clear();
                temp = 0;
                counter = i;                
                
            }           
            
                for (int j=0; j<longest; j++)
                {
                     
                    list.Add(input[counter]);
                    counter++;
                }
        }        

        Console.WriteLine(input[count +1]);
        Console.WriteLine("Longest: ");
        
        foreach (string cat in list)
        {
            Console.Write(cat + " ");
        }

0
g.antonov avatar g.antonov 20 Точки

Още едно решение, базирано е на решението ми на 4-та задача. 

http://pastebin.com/9xzZ1AcP

Накратко - вървим през масива, в който сме записали числата. Знаем, че трябва да отпечатаме всяко число от него, трябва ни само една проверка, за да знаем дали да напишем интервал преди да го отпечатаме или нов ред:

            for (int i = 0; i < arrLength; i++) 
            {
                Console.Write(inputElements[i]);
                if (i < inputElements.Length - 1 && (inputElements[i] < inputElements[i + 1]))
                {
                    Console.Write(" ");
                    testSequenceLength++;
                }
                else
                {
                    Console.WriteLine();
                    if (testSequenceLength > longestSequence)
                    {
                        longestSequence = testSequenceLength;
                        longestSequenceEndPos = i;
                    }
                    testSequenceLength = 1;
                }
            }

Докато въртим през масива обаче, записваме си в едни променливи колко дълга е най-дългата поредица и къде свръшва. Ако знаем тези две неща, лесно можем да напишем един друг цикъл, който ще започва от края на поредицата и ще се завърти толкова, колкото й е дължината:

Console.Write("Longest: ");
for (int i = longestSequenceEndPos; i > longestSequenceEndPos - longestSequence; i--)
{
  if (i < 0)
  {
     break;
  }
     longestSeqReversed.Add(inputElements[i]);           
}

Пълним поредицата в един списък, който сме инициализирали специално за тази работа. Само че понеже започнахме от края на поредицата и вървяхме назад, тя се е записала наобратно. Отпечатваме този списък в обратен ред и получаваме поредицата във възходящ:

for (int i = longestSeqReversed.Count-1; i >= 0; i--)
{
    Console.Write(longestSeqReversed[i]+" ");
}

Не е много интуитивен код, но работи.

1
cap7ainjack avatar cap7ainjack 20 Точки

Добър си е, работи и е добре замислен yes

0
Spaskich avatar Spaskich 36 Точки

Колеги, някой от вас може ли да ми посочи къде е грешката ми. Изваждането на конзолата работи добре, но самото записване на sequence-a не се получава в някои случаи:

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] numbers = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);

        List<int> tempSequence = new List<int>();
        List<int> longestSequence = new List<int>();

        Console.Write(numbers[0] + " ");
        tempSequence.Add(numbers[0]);
        for (int i = 1; i < numbers.Length; i++)
        {
            if (numbers[i] > numbers[i - 1])
            {
                tempSequence.Add(numbers[i]);
                Console.Write(numbers[i] + " ");
            }
            else
            {
                if (tempSequence.Count > longestSequence.Count)
                {
                    longestSequence = tempSequence;
                }
                Console.WriteLine();
                tempSequence.Clear();
                tempSequence.Add(numbers[i]);
                Console.Write(numbers[i] + " ");
            }

            
        }

        Console.WriteLine("\nLongest: {0}", string.Join(" ", longestSequence));
    }
}

Благодаря ви предварително!

0
Gabriela_banova avatar Gabriela_banova 12 Точки

az izpolzvah nachina ot zadacha 4,koito e mn kratuk i  pochti raboti:))-, na output mi reje poslednoto chislo + indexOutOfRange=-outside the bounds??

prekaleno elementarno mi se struva ,ako e po tozi nachin

int [] input = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
            for (int i =0;i < input.Length; i++)
            {
                int currentNumber =input[i];
                int nextNumber = input[i + 1];
                Console.Write(input[i] + " ");
                if (i < input.Length - 1 && currentNumber < nextNumber)
                {
                    Console.Write(" ");
                }
                else
                {
                    Console.WriteLine();
                }

            }

0
Fujitzo avatar Fujitzo 9 Точки

Здравей Spaskich,

Много хубаво и опростено решение, малко не му достига за да работи. Аз бях доста позациклил снощи поне 2ч на тази задача преди най-накрая да дойде евриката:

1во трябва да вмъкнеш още един if в първия, в случай че програмата не стигне до else-a -т.е най-дългата поредица е накрая.

2ро не може да се присвояват списъци с "=". Аз първо зачиствам с .clear() и после с .insertrange(0, temp) - 0лата е позицията от която да започне. Ето го целия код:

int[] numbers = Console.ReadLine().Split().Select(int.Parse).ToArray();

            List<int> temp = new List<int>();
            List<int> longest = new List<int>();

            temp.Add(numbers[0]);
            Console.Write(numbers[0]+" ");

            for (int i = 1; i < numbers.Length; i++)
            {
                if (numbers[i] > numbers[i - 1])
                {
                    temp.Add(numbers[i]);
                    Console.Write("{0} ", numbers[i]);
                    if (i == numbers.Length - 1 && temp.Count > longest.Count)
                    {
                        longest.Clear();
                        longest.InsertRange(0, temp);
                    }
                }
                else
                {
                    if (temp.Count > longest.Count)
                    {
                        longest.Clear();
                        longest.InsertRange(0, temp);
                    }
                    temp.Clear();
                    temp.Add(numbers[i]);
                    Console.WriteLine();
                    Console.Write("{0} ", numbers[i]);
                }
            }
            Console.WriteLine();
            Console.WriteLine("Longest: {0}", string.Join(" ", longest));

1
20/09/2015 18:25:36
Spaskich avatar Spaskich 36 Точки

Благодаря ти, колега! Оправих проблема по твоя начин, но просто пътувам вече 2 дни и нямах време да постна. Мерси и успех! :)

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