Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Поиск арифметической прогрессии в строке


Автор: evgovs1991 21.4.2020, 23:14
Строка представляет собой последовательность натуральных чисел, разделенных
пробелом. Найти в ней все последовательности (не менее трех чисел), являющиеся
арифметическими прогрессиями.
Входные данные:
1 3 4 6 2 4 6 8 1 3 5
Выходные данные:
2 4 6 8
1 3 5
Вот что у меня получилось но всегда на выходе пусто
Код

String text = " 1 3 4 6 2 4 6 8 1 3 5";
        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++;
                   
                }
                else{break;}
            }
             builder.append(numArr[i]);
            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));
        }
 
    }

Автор: vvm28 21.12.2020, 21:47
Код

package ar2;

import java.util.LinkedHashMap;
import java.util.Map;

public class Ar2 {

    private static int[] toInts(String str) {
        str = str.trim();
        String[] split = str.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();
        }
    }

    public static void main(String... args) {
        String str = " 1 3 4 6 2 4 6 8 1 3 5";

        int[] ints = toInts(str);
        int[] deriv = getDerivative(ints);

        Map<Integer, Integer> ranges = new LinkedHashMap<>();
        for (int i = 0; i < deriv.length; i++) {
            if (deriv[i] == 0)
                continue;//пропустить последовательность из одинаковых
            int startIdx = i;
            while (i < deriv.length - 1 && deriv[i] == deriv[i + 1])
                i++;//количество элементов в прогрессии
            if (i - startIdx >= 1)// последовательность не менее 3 элементов
                ranges.put(startIdx, i + 1);
        }

        printRanges(ints, ranges);
    }


}


Вывод:
2 4 6 8 
1 3 5 

Process finished with exit code 0

Автор: LSD 3.5.2021, 12:40
1. Что делать, если число входит более чем в одну последовательность?
2. Порядок важен?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)