найти первый элемент массива, который не является последовательным, с помощью веб-форм - PullRequest
0 голосов
/ 05 августа 2020

Например, если у нас есть массив [1,2,3,4,6,7,8], то 1, затем 2, затем 3, затем 4 - все последовательные, а 6 - нет, так что это первое непоследовательное число. Если весь массив последовательный, верните ноль. В массиве всегда будет как минимум 2 элемента 1, и все элементы будут числами. Номера также будут уникальными и расположены в порядке возрастания. Числа могут быть положительными или отрицательными, и первое, не идущее подряд, тоже может быть любым. пожалуйста, помогите мне Fini sh этот код Я новичок в программировании. Мой код:

using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _2katas
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            var input = this.txtInput.Text;
            var numarray = input.Split(',');
            int firstValue = Convert.ToInt32(numarray[0]);

            
            for (var i = 0; i < numarray.Length; i++)
            {
                if (Convert.ToInt32(numarray[i]) - i != firstValue)
                {
                    lblPrint.Text = "";
                }
               
                else
                {
                    lblPrint.Text = "";
                }



                if (this.rdbConsecutive.Checked == true)
                {
                    lblKataRunning.Text = "Consecutive";
                }
                else if (this.rdbStripCleaning.Checked == true)
                {
                    lblKataRunning.Text = "Strip Cleaning";
                }
            }
        }
    }
}

Ответы [ 5 ]

1 голос
/ 05 августа 2020

Давайте извлечем метод:

Найдите первый элемент массива, который не является последовательным ...

Если весь массив последовательный, то верните null

Мы можем реализовать это так:

private static string FirstInconsecutive(string data) {
  var array = data.Split(',');

  if (array.Length <= 0)
    return null; //TODO: what shall we return on empty array?

  if (!int.TryParse(array[0], out int delta))
    return array[0];

  for (int i = 1; i < array.Length; ++i)
    if (!int.TryParse(array[i], out int value) || value - i != delta)
      return array[i];

  return null;
}

Использование:

string result = FirstInconsecutive(txtInput.Text);

Обратите внимание на int.TryParse, что помогает вернуть правильный ответ "ABC" на ввод типа "1, 2, 3, ABC, 4, 6, 7, 8" (пользовательский ввод txtInput.Text может содержать любую строку)

0 голосов
/ 05 августа 2020

Решение linq только для удовольствия:

static int? FindFirstNonConsecutive(IEnumerable<int> arr)
{
    var nonConsecutiveInfo = 
          arr.Select((i, index) => new {Index = index, Delta = i - index})
             .FirstOrDefault(t => t.Delta != arr.First());
    
    return nonConsecutiveInfo?.Delta + nonConsecutiveInfo?.Index; 
}

Обратите внимание, что это будет работать только при поиске непоследовательных чисел в порядке возрастания в соответствии с требованиями.

0 голосов
/ 05 августа 2020

Один путь к go.

string rawData = "1,2,3,4,6,7,8,9";
IEnumerable<int> data = rawData.Split(',').Select(v => Convert.ToInt32(v));
IEnumerable<int> all = Enumerable.Range(data.Min(), data.Max() - data.Min() + 1);
IEnumerable<int> diff = all.Except(data);
if (diff.Count() == 0)
{
  return null;
}
return data.ElementAt(all.ToList().IndexOf(diff.First()))

NB Не тщательно протестирован.

Просто проверьте разницу на пустоту, чтобы получить номера подряд

0 голосов
/ 05 августа 2020

Два числа не являются последовательными, если левый + 1 <> правый.

Проверьте что-то вроде этого, обратите внимание, что вам нужно изменить проверки границ:

        for (var i = 0; i < numarray.Length - 1; i++)
        {
            if (Convert.ToInt32(numarray[i]) + 1 != Convert.ToInt32(numarray[i+1]))
0 голосов
/ 05 августа 2020

Обновите свое состояние, как показано ниже for l oop, и оно будет работать. Я бы посоветовал вам иметь отдельную функцию, чтобы ее можно было повторно использовать при необходимости в другом месте кода.

Здесь начните свой l oop с i = 1 и сравните значения numarray[i-1] + 1 != numarray[i].

Вы можете преобразовать sting[] в int[] с помощью var numarray = input.Split(',').Select(x => Convert.ToInt32(x)).ToArray(); и использовать его с IsConsecutive(numarray) в соответствии с кодом button1_Click.

Вы можете получить первое непоследовательное значение с незначительными изменениями в return type и return, как показано в GetFirstNonConsecutiveValue().

public bool IsConsecutive(int[] numarray)
{
    for (int i = 1; i < numarray.Length; i++)
    {
        if (numarray[i-1] + 1 != numarray[i])
        {
            return false;
        }                
    }
    return true;
}

public int? GetFirstNonConsecutiveValue(int[] numarray)
{
    for (int i = 1; i < numarray.Length; i++)
    {
        if (numarray[i-1] + 1 != numarray[i])
        {
            return numarray[i];
        }                
    }
    return null;
}

private void button1_Click(object sender, EventArgs e)
{
    var input = this.txtInput.Text;
    var numarray = input.Split(',').Select(x => Convert.ToInt32(x)).ToArray();

    var nonConsecutiveValue = GetFirstNonConsecutiveValue(numarray);
    if (nonConsecutiveValue != null)
    {
        // nonConsecutiveValue is first non consecutive value.
    }
    else
    {
        // sequence is consecutive.
    }       
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...