Внезапно возникла новая для меня Java-задача, которая может показаться тривиальной на первый взгляд. Но мне все же хотелось бы посмотреть на решения других людей. На формулировку задачи меня натолкнула реализация постраничной навигации для категорий на сайте.
Условие: Для произвольного положительного целого числа (n > 0), вывести последовательность промежутков, которые в него входят. Шаг для промежутка - положительное целое число (d > 2).
Несколько пояснений:
Если n = 12, d = 3, то получим: [1-3] [4-6] [7-9] [10-12]
Если n = 10, d = 3, то получим: [1-3] [4-6] [7-9] [10-10]
Если n = 2, d = 3, то получим: [1-2]
Ниже я привожу свой пример кода для решения данной задачи. Хотелось бы увидеть ваши решения в комментариях. Надеюсь они будут лучше =)
1: int n = 2;
2: int d = 3;
3:
4: List<String> ranges = new ArrayList<String>();
5:
6: int start = 0;
7: int finish = 0;
8:
9: if (n % d != 0) {
10: int normalRanges = n / d;
11: int firstPart = normalRanges*d;
12: for (int i = 0; i < firstPart; i += d) {
13: start = i + 1;
14: finish = i + d;
15: ranges.add(start+"-"+finish);
16: }
17: start = firstPart + 1;
18: finish = n;
19: ranges.add(start+"-"+finish);
20: } else {
21: for (int i = 0; i < n; i += d) {
22: start = i+1;
23: finish = i+d;
24: ranges.add(start+"-"+finish);
25: }
26: }
27:
28: for (String s : ranges)
29: System.out.print("["+s+"] ");

Вот такой вариант набросал:
ОтветитьУдалитьimport java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Interval {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Enter a positive integer: ");
int n = s.nextInt();
System.out.println("Enter a step: ");
int d = s.nextInt();
List intList = new ArrayList();
for (int i = 1; i <= n; i+=d)
{
intList.add(i); // начальные значения каждого из промежутков
}
// Если первоначально ввели целое число меньше либо равно шагу, то логично что промежуток [n;d]
if (intList.size() == 0)
{
System.out.print("[" + n + "-" + d + "]");
return;
}
// Вывод промежутков с шагом d
for (int i = 0; i < intList.size(); i++)
{
// если правая часть промежутка больше за n, то выходим из цикла
if(intList.get(i) + d - 1 > n)
break;
System.out.print("[" + intList.get(i) + "-" + (intList.get(i)+d-1) + "]");
}
// Если остался промежуток с шагом, меньшим за d (для этого проверяем условие не равности 0 остатка от деления n на d)
if (n % d != 0)
{
System.out.print("[" + (intList.get(intList.size()-1)) + "-" + n + "]");
}
}
}
Тут конечно можно поразмыслить над правильной формулировкой понятия "промежуток". В твоей задаче промежутком является [10-10], хотя по сути промежуток это набор чисел. К примеру можно уточнить, что выводить ТОЛЬКО промежутки, а одинарные элементы либо игнорировать, либо записать через {10}.
Решение понравилось =)
УдалитьНа счет того, что можно считать промежутком, действительно согласен на счет варианта с записью вида {10}.
Вот такой вариант пришел в голову.
ОтветитьУдалитьint all = 12;
int period = 3;
int balance = all%period;
int[][] mass;
if(balance == 0){
mass = new int[all/period][2];
}else{
mass = new int[all/period + 1][2];
}
int counter = 1;
for (int i = 0; i < mass.length; i++) {
mass[i][0] = counter;
mass[i][1] = counter + period - 1;
counter+=period;
}
if(balance != 0){
mass[mass.length - 1][1] = all;
}
for (int i = 0; i < mass.length; i++) {
System.out.println("[" + mass[i][0] + " " + mass[i][1] + "]");
}
Четенько =)
Удалить