Софтуерно Инженерство
Loading...
+ Нов въпрос
anton_fotev avatar anton_fotev 5 Точки

C# 04. Mixed Up List - More Exercises

Колеги, дава ми 50/100. Пробвах с различни примерни стойности - на конзолата ми дава верни отговори.

Условието на задачата е следното:
Write a program that mixes up two lists by some rules. You will receive two lines of input, each one
being a list of numbers. The rules for mixing are:
- Start from the beginning of the first list and from the ending of the second
- Add element from the first and element from the second
- At the end there will always be a list in which there are 2 elements remaining
- These elements will be the range of the elements you need to print
- Loop through the result list and take only the elements that fulfill the condition
- Print the elements ordered in ascending order and separated by a space

Example

Input :

1 5 23 64 2 3 34 54 12
43 23 12 31 54 51 92

Output:  23 23 31 34 43 51

Comment
After looping through the two of the arrays we get:
1 92 5 51 23 54 64 31 2 12 3 23 34 43
The constrains are 54 and 12 (so we take only the numbers between them):
51 23 31 23 34 43
We print the result sorted

Кодът ми е следния:

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

public class Program
{
    public static void Main()
    {
        List<int> firstInput = Console.ReadLine()
            .Split(new[]{' ', ','}, StringSplitOptions.RemoveEmptyEntries)
            .Select(int.Parse)
            .ToList();
        
        List<int> secondInput = Console.ReadLine()
            .Split(new[]{' ', ','}, StringSplitOptions.RemoveEmptyEntries)
            .Select(int.Parse)
            .ToList();
        
        List<int> mixed = MakeMixedList(firstInput, secondInput);
        
        int minBorder = CheckRigthListAndMin(firstInput, secondInput);
         int maxBorder = CheckRigthListAndMax(firstInput, secondInput);
        
        List<int> rezult = MakeRezultList(mixed, minBorder, maxBorder);
        
        Console.WriteLine(string.Join(" ", rezult));
        

    }
    
     public static int CheckRigthListAndMin(List<int> firstInput, List<int> secondInput)
      {
        if(firstInput.Count > secondInput.Count)
        {
             return Math.Min(firstInput[firstInput.Count -1], firstInput[firstInput.Count -2]);
        }
        else
        {
            return Math.Min(secondInput[secondInput.Count -1], secondInput[secondInput.Count -2]);
        }
      }
    
     public static int CheckRigthListAndMax(List<int> firstInput, List<int> secondInput)
      {
        if(firstInput.Count > secondInput.Count)
        {
             return Math.Max(firstInput[firstInput.Count -1], firstInput[firstInput.Count -2]);
        }
        else
        {
            return Math.Max(secondInput[secondInput.Count -1], secondInput[secondInput.Count -2]);
        }
      }
    
      public static List<int> MakeMixedList(List<int> firstInput, List<int> secondInput)
      {
          List<int> mixed = new List<int>();
          
          if (firstInput.Count > secondInput.Count)
          {
           secondInput.Reverse();
              
           for (int i = 0; i < secondInput.Count; i++)
           {
            mixed.Add(firstInput[i]);
            mixed.Add(secondInput[i]);    
           }
          } // end if
          else
          {
           firstInput.Reverse();
              
           for (int i = 0; i < firstInput.Count; i++)
           {
            mixed.Add(secondInput[i]);
            mixed.Add(firstInput[i]);        
           }  
          } // end else
          
        return mixed;      
      }
    
    public static List <int> MakeRezultList(List<int> mixed, int minBorder, int maxBorder)
    {
         List<int> rezult = mixed
            .Where(x => (minBorder < x && x < maxBorder))
            .OrderBy(x => x)
            .ToList();
        
        return rezult;
    }
}

Тагове:
0
Teamwork and Personal Skills
KaloyanStoyanovvv avatar KaloyanStoyanovvv 61 Точки

Здравей,

Пробвай в единият случай да взимаш индекса на Count-2 и Count-1 както си го направил, а при другия да взимаш индекса на 0 и 1 за да обърнеш логиката.

0
TeodorStefanovPld avatar TeodorStefanovPld 1276 Точки

нещо много си си усложнил живота. Имаш 2 листа единия е винаги е с 2 елемента повече. Поне като чета условието и като гледам примера.

Въртиш проверяваш луда работа а ти трябват точно 2 или 3 реда като се замислиш.

 var listOne=new List<int>{1,2,3,33,44,11};
         var listtwo=new List<int>{11,100,45,34,12};
         var mixed= listOne.Take(listOne.Count-2).Concat(listtwo);
         var result=mixed.Where(x=>x>=Math.Min(listOne[listOne.Count-1],listOne[listOne.Count-2]) && x<=Math.Max(listOne[listOne.Count-1],listOne[listOne.Count-2]));
        Console.WriteLine(string.Join(" ",result.OrderBy(x=>x)));

 

ето това е, нарочно малко го разписах иначе реално може да се навърже в един linq statement. 

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

След това филтрираме новия лист като с math.max и math.min определяме кой от 2та заделени елемента е горната и долна граница. И получения резултат го принтираме  като преди това го подреждаме в момента е подреден  asc. 

и примера които давам ти връща 34 33 12 11 и като видиш че горната ти граница е 44 а долната 11 това са правилните резултати :Д Сега забелязах че не казват кои лист ще е по дългия но това лесно можеш да си го определиш с 1 проверка на count listone и listtwo и другото си остава същото.

 

 

0
31/05/2019 20:04:10
anton_fotev avatar anton_fotev 5 Точки

Мерси. Ще опростя кода и ще пробвам.

П.П. Иначе усложних кода от параноя - понеже никъде в условието не се гарантира, че винаги първия ред ще е по-дългия.

0