Member 13720262 Ответов: 2

Пропущенное число в последовательности (числа находятся в порядке убывания)


набор чисел, которые находятся в последовательности, расположены в порядке убывания в виде строки s.но
одно из последовательных чисел отсутствует между ними в строке s.эта строка s передается в качестве входных данных программе.эта программа должна идентифицировать отсутствующее число m и вывести его в качестве выходных данных.

sample input and output:

input:

600599598596

output:

597


Что я уже пробовал:

помогите мне решить эту программу.

PrafullaVedante

Ваши входные данные не расположены в порядке возрастания. Либо постановка задачи, либо входное значение-это неправильный Гриффиндор.

Patrice T

Вот почему в заявлении говорится: "порядок убывания"

2 Ответов

Рейтинг:
19

OriginalGriff

Посмотрите на входную строку:

600599598596
Первое, что нужно сделать, это определить последовательность.
Начните с предположения, что наибольшее число имеет 1 цифру:
6,0,0,5,9,9,5,9,8,5,9,6
Это работает? Нет - потому что у вас два нуля вместе.
Так что попробуйте с 2-мя цифрами:
60,05,99,59,85,96
Это работает? No - 99 больше, чем 05
Следующие три цифры:
600,599,598,596
Разве это работает? Да. Каждое из значений меньше предыдущего, и большинство из них имеют разницу в единицу.
Какой номер пропал? 597

Вы можете сделать это вручную просто так, и ваша задача состоит в том, чтобы автоматизировать процесс - но это точно так же, как делать это вручную, но в коде. Все, что вам нужно сделать, это найти правильную длину числа, извлекая каждый набор символов и преобразуя его в число. Затем вы можете посмотреть на числовые последовательности и посмотреть, что у вас есть, и если это нисходящая последовательность.

Выберите язык из 5 очень разных, которые вы отметили, и дайте ему попробовать: это не так уж сложно, когда вы начинаете делать это вручную, чтобы понять, как это сделать.


Maciej Los

Хорошо объяснил!

CPallini

5.

Рейтинг:
0

Maciej Los

В дополнение к OriginalGriff[^решение], я хотел бы предоставить пример кода с небольшим улучшением.
Мое решение основано на Linq:

string sentence = "600599598596";
//string sentence = "60595856";
int len = sentence.Length;
int half = len/2;
//here is a magic!
    var dividers =  Enumerable.Range(1, half).Where(i=>len%i==0).ToList();
foreach(int d in dividers)
{
    //create list of chars for later use
    List<int> numbers = new List<int>();
    //loop through the chars in sentence
    //[i] - counter
    int i = 0;
    do
    {
        //get number of chars accordingly  to the value stored in [d]
        string tmp = string.Join("", sentence.Skip(i).Take(d));
        //try parse string into integer
        //if possible, then add it to the list
        int number = 0;
        if (Int32.TryParse(tmp, out number)) numbers.Add(number);
        i+=d;
    } while (i<len);
    //find missing value
    var misVal = numbers.Zip(numbers.Skip(1), (first, second) => Tuple.Create(first, second, first-second-1))
        .Where(x=>x.Item3==1)
        .Select(x=> x.Item2+1)
        .FirstOrDefault();
    Console.WriteLine("For list: [{0}] missing value is: {1}", string.Join(";", numbers), misVal);
}


Результат:
For list: [6;0;0;5;9;9;5;9;8;5;9;6] missing value is: 0
For list: [60;5;99;59;85;96] missing value is: 0
For list: [600;599;598;596] missing value is: 597
For list: [600599;598596] missing value is: 0


Если вы хотите вернуть список пропущенных значений, измените последний запрос в эту форму:
var misVal = numbers.Zip(numbers.Skip(1), (first, second) => Tuple.Create(first, second, first-second-1))
	.Where(x=>x.Item3==1)
	.Select(x=>x.Item2+1)
	.ToList();


Не стесняйтесь менять код в соответствии с вашими потребностями!


CPallini

5.

Maciej Los

Спасибо, Карло.