Hocam merhabalar elinize sağlık. Bu gibi algoritma sorularına çözerken önceden white board'da nasıl bir mantık yürütüceğinizi anlatırsanız çok güzel olur. Teşekkürler.
Hocam, teşekkür ederim. Bahsettiğiniz basit düşünce mantığını biraz anladığımı söyleyebilirim. Tam olarak gerekli kuralları bulduktan sonra kodlama tarafına en basit şekilde geçmem gerekiyormuş. Emeğiniz için tekrar teşekkür ederim.
Your recursive approach is nice. And, here is my linear approach that uses one for loop. I have inspired some points from your nice code as-is, such as inline incrementing, throwing exception etc. (Because you have done the required improvements already.). private static string GenerateParanthesis(int length) { if (length % 2 != 0) throw new ArgumentException("length must be even."); StringBuilder stringBuilder = new StringBuilder(); char[] parans = new char[2] { '(', ')' }; int paranthesisIndex = 0; // 0 for open paran, and 1 for close paran. int openCount = 1; int closeCount = 0; int maxParan = length / 2; stringBuilder.Append(parans[paranthesisIndex]); for(int i = 1; i < length; i++) { if (openCount == maxParan) paranthesisIndex = 1; else if (openCount == closeCount) paranthesisIndex = 0; else if (openCount > closeCount) paranthesisIndex = Random.Shared.Next(2); openCount += paranthesisIndex == 0 ? 1 : 0; closeCount += paranthesisIndex == 1 ? 1 : 0; stringBuilder.Append(parans[paranthesisIndex]); } return stringBuilder.ToString(); }
One note about code: Such a pattern that conforms the rules must be start by an open paranthesis, otherwise the pattern doesnt become valid. Therefore, we append an open paranthesis at first and start the loop from 1.
static readonly char[] arr = new[] { '(' , ')' }; public static string function(int length) { string res = ""; for(int i=0; i< length; i++) { if(i < length/2) res += arr[0]; else res += arr[1]; } return res; } public static void Main(string[] args) { Console.WriteLine(function(6)); } aslında bu kadar basit ve toplamda 10 satır kod ile yapılabilecek bir kodu bu kadar detaylı ve uzun yazmanızın bir anlamı var mı?
Ben de böyle bir çözüm yaptım ama bütün validleri alıp aralarından seçiyor. Tam olarak sorunun istediği bir yaklaşım mı emin değilim. public static List xd = new List(); public static string Solve(int length) { GenerateParanthesis(0,0,length/2,""); int random = RandomNumberGenerator.GetInt32(xd.Count); return xd[random]; } static void GenerateParanthesis(int open, int close, int count, string value) { if (count == close) { xd.Add(value); return; } if (open < count) GenerateParanthesis(open + 1, close,count, value + "("); if (close < open) GenerateParanthesis(open, close+1, count, value +")"); }
Ben stack mantığı kullanarak her açık parantez görüldüğünde listeye ekleyip kapalı parantez görüldüğünde listeden eleman silmeyi ve sonunda listede hiç eleman kalmaması gerektiğini düşünmüştüm. Sizce optimal bir yol mu ?
Bu mülakatın yapıldığı bir önceki videonun altında tüm olasılıkları bir array içinde dönecek şekilde yaptım, fakat doğru bulunmamıştı. Vaktin olursa bir bak, yorumunu bekliyorum.@@feanorwasright
Merhaba, mülakat videosunu izledim ve gerçekten çok faydalı olduğunu düşünüyorum, ellerinize sağlık. Soruyu bende görüp kendimce bir çözüm bulmak istemiştim. Biraz daha farklı bir yaklaşım ile ilerledim aşağıda java ile kendi oluşturduğum metodu paylaşmak isterim. public String generatePattern(int length){ if(length % 2 != 0) return "invalid request"; if(length==2) return "()"; Random random=new Random(); Boolean randBoolean=random.nextBoolean(); if(randBoolean){ return "(" + generatePattern(length - 2) + ")"; }else { return "()" + generatePattern(length - 2); } }
Bu method rastgelelik konusunda biraz eksik gibi sanki çıktı olarak sadece "()()()" ve "((()))" gibi çıktılar verebilir. Soruda istenilen rastgele ve validate bir durum örnek olarak "(()())" verebilirim.
@@hasankoc1459 metodun rastgelelik konusunda aslında bir eksiği yok diyebilirim. Metodu çağırdığımda aldığım çıktılar şu şekilde: ()(()) (()()) ()() ()(()()) ()()()() (((()()(()())))) ()()(()()()()()) (()(()((()(((((()((()())))))))))))
Hocam merhabalar elinize sağlık. Bu gibi algoritma sorularına çözerken önceden white board'da nasıl bir mantık yürütüceğinizi anlatırsanız çok güzel olur. Teşekkürler.
Bellek tüketiminin daha optimize eden yaklaşımı da göstermeniz çok güzel olmuş, içeriğin için teşekkürler!
Algoritma sorularında bellek konularına bilhassa önem göstermek gerekiyor. Teşekkürler :)
Hocam, teşekkür ederim. Bahsettiğiniz basit düşünce mantığını biraz anladığımı söyleyebilirim. Tam olarak gerekli kuralları bulduktan sonra kodlama tarafına en basit şekilde geçmem gerekiyormuş. Emeğiniz için tekrar teşekkür ederim.
Aklıma her parantez açışında recursive fonksiyon açıp duruma göre kapatmak isteyen bir kod gelmişti.
Bu da başka bir videonun konusu :)
Your recursive approach is nice. And, here is my linear approach that uses one for loop. I have inspired some points from your nice code as-is, such as inline incrementing, throwing exception etc. (Because you have done the required improvements already.).
private static string GenerateParanthesis(int length)
{
if (length % 2 != 0)
throw new ArgumentException("length must be even.");
StringBuilder stringBuilder = new StringBuilder();
char[] parans = new char[2] { '(', ')' };
int paranthesisIndex = 0; // 0 for open paran, and 1 for close paran.
int openCount = 1;
int closeCount = 0;
int maxParan = length / 2;
stringBuilder.Append(parans[paranthesisIndex]);
for(int i = 1; i < length; i++)
{
if (openCount == maxParan)
paranthesisIndex = 1;
else if (openCount == closeCount)
paranthesisIndex = 0;
else if (openCount > closeCount)
paranthesisIndex = Random.Shared.Next(2);
openCount += paranthesisIndex == 0 ? 1 : 0;
closeCount += paranthesisIndex == 1 ? 1 : 0;
stringBuilder.Append(parans[paranthesisIndex]);
}
return stringBuilder.ToString();
}
If anything can be done by a loop, could be done by recursive as well :) thanks for sharing the code.
One note about code:
Such a pattern that conforms the rules must be start by an open paranthesis, otherwise the pattern doesnt become valid. Therefore, we append an open paranthesis at first and start the loop from 1.
@@semihartan yeah, I see that :)
static readonly char[] arr = new[] { '(' , ')' };
public static string function(int length)
{
string res = "";
for(int i=0; i< length; i++)
{
if(i < length/2)
res += arr[0];
else
res += arr[1];
}
return res;
}
public static void Main(string[] args)
{
Console.WriteLine(function(6));
}
aslında bu kadar basit ve toplamda 10 satır kod ile yapılabilecek bir kodu bu kadar detaylı ve uzun yazmanızın bir anlamı var mı?
Sizin kodunuz her çalıştığında sadece '((()))' bu pattern'i üretecek. Ancak '()()()', '()(())' veya '(())()()' gibi pattern'ler de mümkün olmalı.
Ben de böyle bir çözüm yaptım ama bütün validleri alıp aralarından seçiyor. Tam olarak sorunun istediği bir yaklaşım mı emin değilim.
public static List xd = new List();
public static string Solve(int length)
{
GenerateParanthesis(0,0,length/2,"");
int random = RandomNumberGenerator.GetInt32(xd.Count);
return xd[random];
}
static void GenerateParanthesis(int open, int close, int count, string value)
{
if (count == close)
{
xd.Add(value);
return;
}
if (open < count)
GenerateParanthesis(open + 1, close,count, value + "(");
if (close < open)
GenerateParanthesis(open, close+1, count, value +")");
}
tesekkurler
Ben stack mantığı kullanarak her açık parantez görüldüğünde listeye ekleyip kapalı parantez görüldüğünde listeden eleman silmeyi ve sonunda listede hiç eleman kalmaması gerektiğini düşünmüştüm. Sizce optimal bir yol mu ?
Bu bize random parantezler vermez ki, sadece bir parantez string inin dengeli olup olmadığının cevabını verir.
@@TechBuddyTR Evet ben dengeli olmasını düşünmüşüm. Teşekkür ederim.
Python ile şöyle çözdüm
from random import randint
def generatePatternRev01(length):
result=""
while len(result)
çözememişsin doğru bir output vermiyor
@@feanorwasright
print(generatePatternRev01(7))
>>> ()()()()
Hala çalışıyor gözüküyor. Sorun yok.
@@elimelimopelek sorun var. output bu değil, mümkün olan bütün parantezleri bir liste halinde dönmeli
Bu mülakatın yapıldığı bir önceki videonun altında tüm olasılıkları bir array içinde dönecek şekilde yaptım, fakat doğru bulunmamıştı. Vaktin olursa bir bak, yorumunu bekliyorum.@@feanorwasright
bu soru klasiktir, leetcode generate parantheses sorusuna bak orda yüzlerce çözüm var@@elimelimopelek
Merhaba, mülakat videosunu izledim ve gerçekten çok faydalı olduğunu düşünüyorum, ellerinize sağlık. Soruyu bende görüp kendimce bir çözüm bulmak istemiştim. Biraz daha farklı bir yaklaşım ile ilerledim aşağıda java ile kendi oluşturduğum metodu paylaşmak isterim.
public String generatePattern(int length){
if(length % 2 != 0)
return "invalid request";
if(length==2)
return "()";
Random random=new Random();
Boolean randBoolean=random.nextBoolean();
if(randBoolean){
return "(" + generatePattern(length - 2) + ")";
}else {
return "()" + generatePattern(length - 2);
}
}
Bu method rastgelelik konusunda biraz eksik gibi sanki çıktı olarak sadece "()()()" ve "((()))" gibi çıktılar verebilir.
Soruda istenilen rastgele ve validate bir durum örnek olarak "(()())" verebilirim.
@@hasankoc1459 metodun rastgelelik konusunda aslında bir eksiği yok diyebilirim. Metodu çağırdığımda aldığım çıktılar şu şekilde:
()(())
(()())
()()
()(()())
()()()()
(((()()(()()))))
()()(()()()()())
(()(()((()(((((()((()())))))))))))
@@talhatoprak7403 tekrar kontrol ettim de yanlış yorumlamışım üzgünüm :) .
moralim bozuldu ya ben neden aşırı karmaşık bir şey düşündüm ki
Saolun hocam, sanki biraz daha Mid seviyeye yakın bir mülakat sorusu olmuş
Junior için bile kolaydı bence. Türkiye standartlarında değil tabi, büyük şirketlerin mülakatlarına göre :)
Ben mülakatta bunu sorsam işe alacak adam bulamam :)
:-D Ben de anca simülasyonlarda buluyorum işte
string GeneratePattern(int a = 6)
{
Random random = new Random();
string result = "";
int openParanth = a/2;
int closeParanth = a/2;
while (result.Length < a)
{
double randomNumber = random.Next(2, 4);
if (randomNumber == 3)
{
if (closeParanth - 1 >= openParanth)
{
result +=')';
closeParanth -= 1;
}
else
{
result+='(';
openParanth -= 1;
}
}
else
{
if (openParanth > 0)
{
result += '(';
openParanth -= 1;
}
}
}
return result;
}