Sırayla numaralar 0 ile 31 arasında sıralı sayıların düzenli bir sayı [8] içinde bulmak istiyorum. Ardışık sayılar en az 3 ve en fazla 3 olmalıdır. 5 sayı.Bir arka planda tüm ardışık sayıları bulun Bir int []
Örnekte, sonuncusu bana çok gerçek bir problem veriyor.
örn:
int[] = new int[] { 3,7,14,16,23, 28, 29 ,30 } // no result (28,29 is length of 2 numbers)
int[] = new int[] { 4,5,6,7,18, 19, 20 ,21 } // 4,5,6,7 (yes! length of 4!!)
int[] = new int[] { 2.3.4.5.6.7.8.9 } // two results : 2,3,4 and 5,6,7,8,9
Ben çözüm ama generalleri kullanarak çalışıyorum çünkü soruyu yaklaşım nasıl sadece bir örnektir istemiyorum ve ben gerçekten sıkıştım!
Yardımlarınız için teşekkürler!
Hıristiyan
-bu sana bazı örnekler alıp kağıda yazmak önermek (benim mutfaktan değil çorbası) başladığım yerden kod
public partial class Test2 : Form
{
public Test2()
{
InitializeComponent();
}
private void Test2_Load(object sender, EventArgs e)
{
int[] numbers = new[] { 21, 4, 5, 22, 17, 6, 20, 23 };
// int[] numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
foreach (Campo r in FindRanges(numbers, 3))
{
listBox1.Items.Add(string.Join(", ", r.Select(x => x.ToString()).ToArray()));
}
}
struct Campo : IEnumerable<int>
{
readonly int _start;
readonly int _count;
public Campo(int start, int count)
{
_start = start;
_count = count;
}
public int Start
{
get { return _start; }
}
public int Count
{
get { return _count; }
}
public int End
{
get { return _start + _count - 1; }
}
public IEnumerator<int> GetEnumerator()
{
for (int i = 0; i < _count; ++i)
{
yield return _start + i;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
public static Campo operator +(Campo x, int y)
{
return new Campo(x.Start, x.Count + y);
}
public Campo removefirst()
{
return new Campo(this.Start + 3, this.Count);
}
public Campo removelast()
{
return new Campo(this.Start, this.Count - 1);
}
}
static IEnumerable<Campo> FindRanges(IEnumerable<int> source, int minCount)
{
var ordered = source.OrderBy(x => x);
Campo r = default(Campo);
foreach (int value in ordered)
{
if (r.Count == 0)
{
r = new Campo(value, 1);
continue;
}
if (r.Count == 5)
{
r = r.removefirst();
continue;
}
if (value == r.End)
{
continue;
}
if ((value == 0 || value == 8 || value == 16 || value == 24) && (r.Count > minCount))
{
continue;
}
if ((value == 7 || value == 15 || value == 23 || value == 31) && (r.Count == 1))
{
continue;
}
else if (value == r.End + 1)
{
r += 1;
}
else
{
if (r.Count >= minCount)
{
yield return r;
}
r = new Campo(value, 1);
}
}
if (r.Count >= minCount)
{
yield return r;
}
}
}
Bunu çözmek için kullandığınız kod nerede? – birryree
(r.Count == 5) // daha iyisi (r.count> 5) { r = r.removefirst(); devamı; } –
Jon'un önerdiği gibi bir kağıt parçasıyla başlayın. Temiz bir plaka ile başlamak genellikle daha kolaydır. – Lucero