Здравейте, имам проблем със задача 3 от Mock Exam 4
Sign in това е условието.
Ще съм много благодарна за съвет.
Това е решението ми.
using System;
using System.Collections.Generic;
namespace next
{
class Program
{
static void Main(string[] args)
{
string title = Console.ReadLine();
int lines = int.Parse(Console.ReadLine());
int index = -1;
for (int i = 0; i < lines; i++)
{
string word = Console.ReadLine().ToLower();
string temp = title;
if (word.Length>title.Length)
{
Console.WriteLine("No such title found!");
index = 2;
continue;
}
for (int j = 0; j < word.Length; j++)
{
index = temp.IndexOf(word[j].ToString());
if (index > -1)
{
temp = temp.Remove(index, 1);
index = -1;
if (j == word.Length-1)
{
index = 1;
}
}
}
if (index == 1)
{
Console.WriteLine(temp);
title = temp;
}
else if(index == -1)
{
Console.WriteLine("No such title found!");
}
}
}
}
}
Здравей, бих ти препоръчал да провериш пак условието, също така не съм сигурен този magic string - “Title” от къде идва.
На кратко, идеята е че трябва да прочетеш input и N (броя на думите, който ще трябва да провериш дали присъстват в останалият input).
Ето един пример:
string input = Console.ReadLine();
int n = int.Parse(Console.ReadLine());
for(int i =0; i < n; i++)
string currentWord = Console.ReadLine();
//logic if contains (remove it from input)
if(contains)
//Print something
else
//Print something else
Бих те посъветвал, като изпращаш код да използваш Pastepin и когато имаш въпроси да се по конкретни.
Поздрави,
Мишо
Благодаря, че ми отговори.
Това е решението в Pastebin https://pastebin.com/FfyBVm6g
Добавих коментари в началните редове, за да е по-ясно коя променрива, какво представлява.
Проблема ми е, че първите 3 и последните 2 теста минават, но не и другите. Пренаписах кода 5-6 пъти от нулата, но все я докарвам до там и не мога да разбера, какво изпускам като логика.
Пробвах вместо string да използвам chаr [ ], методи, List, но …
Здрасти, пусни си програмата в debug и прегледай логиката в нестнатия For.
Също така, погледни тази логика:
for (int j = 0; j < word.Length; j++)
Идеята е че трябва да минеш през Title/Temp за всеки character от word/currentWord и да провериш дали го има, ако char-ровете съществуват в дадената последователност да ги изтриеш от Title/Temp и това да го направиш N на брой пъти.
Здравей, в нестнатия for въртя по дължината на word (подадената дума, чиито символи трябва да намеря в title), а с IndexOf намирам индекса на първото намерено съвпадение в temp\title за всяка буква от word, ако има съвпадение премахвам намерената буква в temp, като запазвам title непроменен, а ако няма такава буква IndexOf връща - 1 и печатам, че не е намерена думата и презаписвам отново temp да е равен на title и заличавам промените. Ако цялата дума се съдържа сетвам index =1 записвам промените (премахването на намерените букви) и печатам остатъка. За това не въртя по дължината на temp/title, a по word.
А външния for върти по N, който съм задала като lines.
Здрасти, изпращам ти решението на задачата:
Мисля, че ако оправиш логиката с IndexOf и провериш какъв string се формира на 34 ред, ще намериш отговора.
Поздрави
Благодаря много! Там е бил проблема. Явно с Remove() не е толкова прецизна операция.
Доста ме измъчи тази задача, благодаря още веднъж!
И аз се чудя къде ми е грешката и не мога да я намеря…
Някой би ли хвърлил един поглед,моля!
using System;
namespace Title_Search
{
class Program
{
static void Main(string[] args)
{
string title = Console.ReadLine();
int n = int.Parse(Console.ReadLine());
for (int i = 0; i < n; i++)
{
string lettersInclude = string.Empty;
int index = 0;
string checkWords = Console.ReadLine();
for (int j = 0; j < checkWords.Length ; j++)
{
for (int l = index; l < title.Length ; l++)
{
if (checkWords[j] == title[l])
{
lettersInclude += title[l];
index = l;
break;
}
}
}
index = 0;
if (checkWords == lettersInclude)
{
for (int j = 0; j < checkWords.Length; j++)
{
for (int l = index; l < title.Length; l++)
{
if (checkWords[j] == title[l])
{
title =title.Remove(l,1);
break;
}
}
}
}
else
{
Console.WriteLine("No such title found!");
continue;
}
Console.WriteLine(title);
}
}
}
}
Здрасти,
Пробвай вместо с Remove да запазваш оставащата част от title със Substring в 2 части, като първата е от началото до съвпадащия символ, а втората започва от този след него и до края.
Във същата променлива “Title” ли ? Би ли ми показала как точно би станало?
Тези промени ще ти решат проблема.
Здравейте, и мен тази задача много ме измъчи.
Искам да попитам обаче нещо което забелязах. В примера на @Dimityrdimitrov92 в първата част можем да влезем в условие което не изглежда коректно… давам пример:
ако тестваме с title примерно “asdf” и да речем имаме 2 думи първата от които е “ss”, понеже започваме следващата итерация на цикъла от id (където се намира същата буква) от предната итерация а не от id+1, излиза, че думата се съдържа което е грешно или просто аз пропускам нещо в условието… ако може да дадете мнение дали е така и дали Mock Exams допускат и неправилни решения защото всъщност с този алгоритъм дава 100 точки и accept-ва всичко.
Ето снимка с тестовите данни. Въвеждаме “ss” като първа дума и все пак алгоритъмът я приема като валиден sequence. При тест в сайта дава 100 точки както споменах !