Поиск арифметической прогрессии в строке

 
 
 
Сообщения:3
Строка представляет собой последовательность натуральных чисел, разделенных
пробелом. Найти в ней все последовательности (не менее трех чисел), являющиеся
арифметическими прогрессиями.
Входные данные:
1 3 4 6 2 4 6 8 1 3 5
Выходные данные:
2 4 6 8
1 3 5
Подскажите поиск можно ли осуществить с помощью регулярного выражения? если разность текущего и следующего числа не меняется, значит это и есть прогрессия а вот реализовать не получается
 
 
Сообщения:55
if ((a[i + 2] - a[i + 1]) == (a[ i+ 1] - a[i])) {
System.out.printlf("%2d%2d%2d", a[i], a[i + 1], a[i + 2]);
}

Топорно и дает только 3 числа)) но можно модернизировать:
пхай все числа в массив a[] и получай:
boolean b = true;
int i = 0;
int j = 0;
while( i < a.length ) {
    if(b) {
    if ((a[i + 2] - a[i + 1]) == (a[ i+ 1] - a[i])) {
    System.out.printlf("%2d%2d%2d", a[i], a[i + 1], a[i + 2]);
    j = a[i + 1] - a[i];
    b = false;
    i++;
    } else if ((a[i  + 1] - a[i]) == j) {
        System.out.printlf("%2d", a[i + 1]);
    }
        else {
        System.out.println();
        b = true;
        j = 0;
        }
    i++;
}
    
     


Я не пробовал, но должно работать. код писал прям тут, могут быть ошибки!
Если надо могу прокомментировать все переменные и действия, но мне лениво, я даже не заморачивался с названием переменных

пробежал глазками по своим каракулям: не будет работать если два соседних числа в последовательности равны, и \n выдаст целую кучу)) ну главное волну поймать а там если интересно можно на основе свое сварганить или это до ума привести :-)

П.С. Я так понял "алгоритмы наше всё" в Java не канает, и все мои простынки надо укомплектовывать окуратненько в строчку/две. в веду скудных познаний API что то емкое предложить не могу. Да и этот код в качестве итогового не годится, его надо оптимизировать!
Изменен:21 апр 2020 19:30
 
 
Сообщения:3
DoHXyaHMaTy:
Топорно и дает только 3 числа)) но можно модернизировать:
пхай все числа в массив a[] и получай:
сомнительный код, си с++ и java всё в кучу
 
 
Сообщения:55
а что тут из С++, пол Java это С++))))
 
 
Сообщения:3
вот что у меня получилось но не работает
String text = t1.getText();
        ArrayList<String> res= new ArrayList<>();
        int[] numArr = Arrays.stream(text.split(" ")).mapToInt(Integer::parseInt).toArray();
        int raz=0;int count =0, index=0;
        for(int i=0; i<numArr.length-1; i++){
            raz=numArr[i]-numArr[i+1];
            StringBuilder builder = new StringBuilder();
            for(int k = i+1; k<numArr.length-1; k++){
                if(raz==numArr[k]-numArr[k+1]){
                    count++;
                    builder.append(numArr[i]);
                }
                else{break;}
            }
            if(count>=3){
                res.add(builder.toString());
                count=0;
                builder.delete(0, builder.length());
            }
            count=0;
        }
        for(int i=0; i< res.size(); i++){
            System.out.println(res.get(i));
        }

    }
 
 
Сообщения:9961
Требует 3N памяти: строка + массив для распарсченых чисел + массив с дискретной производной. Ну и 3N по скорости (распарсить, построить производную, ну и сам алгоритм нахождения прогрессий).
public class Main {
    public static void main(String...args) {
        int[] ints = toInts("-3 -4 -5 1 2 2 2 3 4 5 6 0 1 2 4 6 0 1 2");
        int[] deriv = getDerivative(ints);

        Map<Integer, Integer> ranges = new LinkedHashMap<>();
        for (int i = 0; i < deriv.length; i++) {
            if(deriv[i] == 0)
                continue;//skipping sequences of same elements
            int startIdx = i;
            while(i < deriv.length - 1 && deriv[i] == deriv[i+1])
                i++;//counting number of elements in the progression
            if(i - startIdx >= 1)// sequence of at least 3 elements
                ranges.put(startIdx, i+1);
        }

        printRanges(ints, ranges);
    }

    private static int[] toInts(String s) {
        String[] split = s.split(" ");
        int[] ints = new int[split.length];
        for (int i = 0; i < split.length; i++)
            ints[i] = Integer.parseInt(split[i]);
        return ints;
    }
    private static int[] getDerivative(int[] ints) {
        int[] deriv = new int[ints.length - 1];
        for (int i = 0; i < ints.length - 1; i++)
            deriv[i] = ints[i+1] - ints[i];
        return deriv;
    }
    private static void printRanges(int[] ints, Map<Integer, Integer> ranges) {
        for (Map.Entry<Integer, Integer> entry : ranges.entrySet()) {
            for(int i = entry.getKey(); i <= entry.getValue(); i++)
                System.out.print(ints[i] + " ");
            System.out.println();
        }
    }
}
Результат:
-3 -4 -5 
2 3 4 5 6 
0 1 2 
2 4 6 
0 1 2 
Изменен:21 апр 2020 21:19
 
 
Сообщения:55
ой в своем коде напутал, но распутаю завтра! У тебя исправлять лень, темболее многих тем еще не знаю, но ошибки следующие:
в первый круг с идеальными значениями у тебя уже есть тройка последователей ты пускаешь в печать только numArr[i] и count у тебя равен 1. выходя во внешний цикл не хера не печатается так как count < 3 даже с условием что ты нашел тройку, твой алгаритм обижается и говорит - Все херня давай с начала и count снова 0. плюс ты прибавляешь почему то по i
хотя находишся в цикле k. Даже еслиб и работало выдало кучу одинаковых чисел i

Я пытался исправить но многих моментов еще не знаю (которыми ты пользуешся, я 2 неделю учу) первая четверка получилась а дальше херь полезла.
Если надо то по твоему алгоритму могу написать но в упращеном варианте (как ты говоришь на Си с++)

Но впринципе главное не алгоритм, а умение пользоваться средствами, в этом я 0, вон у Старовера код красивенький, завтра по буковке буду разбирать))
Изменен:21 апр 2020 21:31
 
 
Сообщения:55
evgovs1991:
вот что у меня получилось но не работает


Замените это

for(int k = i+1; k<numArr.length-1; k++){
                if(raz==numArr[k]-numArr[k+1]){
                    count++;
                    builder.append(numArr[i]);
                }
                else{break;}
            }
            if(count>=3){


На это

for(int k = i+1; k<numArr.length-1; k++){
        if(raz==numArr[k]-numArr[k+1]){
        	i++;   //обязательно надо повышать, чтоб не повторятся
            count++;
            builder.append(numArr[k-1]+" "); //добавляем по внутреннему циклу, и только по нему
            if (k == numArr.length-2) { //если это предпоследний элемент он нас на хер пошлет и не даст закрыть последовательность
        	    builder.append(numArr[k]+" "); //закрываем последовательность если больше нет элементов в массиве
        	    builder.append(numArr[k+1]+" ");
            }        
        }
        else{
        	builder.append(numArr[k-1]+" "); //добавляем 2 крайних числа конечной последовательности
        	builder.append(numArr[k]+" ");   //иначе мы их просто просрем , не боимся добовлять
        	break;}   //если мы не найдем последовательность, эти данные пойдут в сборщик мусора
                         //так как во внешнем цикле вы пользуетесь инициализацией new         
    }
    if(count>=1){ //1 потому что счетчик меняется на 1 уже при последовательности из 3 чисел


Уснуть не мог)) красоты мало, но работает. красота перепишет все к херам)) старался минимум отходить от логики вашей программы
Изменен:21 апр 2020 22:22
 
 
Сообщения:55
Староверъ:
Требует 3N памяти: строка + массив для распарсченых чисел + массив с дискретной производной. Ну и 3N по скорости (распарсить, построить производную, ну и сам алгоритм нахождения прогрессий).

Время на написание этой программы? с учетом планирования и составления алгоритма(если такое было)
Мне надо на что ровняться. залипать над кодом или гнать быстро и без оглядки. а то начинаю старый код перегонять, модернизировать что то...
интересно но по факту куча времени и минимум движения в перед.
и мне как начинающему разбирать вашу программу или еще рановато?( только к интерфейсам перешел)
Изменен:21 апр 2020 22:27
 
 
Сообщения:9961
DoHXyaHMaTy:
Мне надо на что ровняться. залипать над кодом или гнать быстро и без оглядки
Лучше залипать и не обращать внимание на то сколько это занимает по времени. Особенно если речь про обучение.
DoHXyaHMaTy:
интересно но по факту куча времени и минимум движения в перед.
Так программирование и выглядит.
DoHXyaHMaTy:
и мне как начинающему разбирать вашу программу или еще рановато?( только к интерфейсам перешел)
Да нет, там ничего такого, чистая Java. Пролагаю что Map/LinkedHashMap только могли ввести в ступор. Если счас не понятно, то после того как дойдешь до java.util.Map можешь вернуться и перечитать.

PS: не надо сильно захламлять темы, если возникли какие-то новые мысли, лучше обновить существующий ответ чем распыляться на 5 новых.
Изменен:22 апр 2020 17:05
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет