Sorprendentemente molti ans wers in breve tempo ...
ho seguito la stessa idea che è stato già proposto in altre risposte: Quando il tempo di avvio s
è inferiore al tempo di fine e
, allora il risultato può essere suddiviso in due calcoli separati, per gli intervalli [s,24]
e [0,e]
.
Questo può essere fatto "a vicenda", quindi ci sono solo 3 semplici casi da considerare, e i restanti possono essere fatti con chiamate ricorsive.
Tuttavia, ho cercato di
- considerare il fatto che (secondo le immagini), i punti finali dovrebbero essere inclusiva (!)
- aggiungere alcuni casi di test
- Visualizza le configurazioni ben :-)
Questo è il risultato come MCVE:
public class OverlappingIntervals
{
private static final long INTERVAL_SIZE = 24;
public static void main(String[] args)
{
test(6,23, 2,17);
test(0,12, 12,2);
test(11,4, 12,3);
test(12,4, 11,3);
}
private static void test(
long s0, long e0, long s1, long e1)
{
System.out.println(createString(s0, e0, s1, e1));
System.out.println(findOverlappingInterval(s0, e0, s1, e1));
}
private static String createString(
long s0, long e0, long s1, long e1)
{
StringBuilder sb = new StringBuilder();
sb.append(createString(s0, e0, "A")).append("\n");
sb.append(createString(s1, e1, "B"));
return sb.toString();
}
private static String createString(long s, long e, String c)
{
StringBuilder sb = new StringBuilder();
for (int i=0; i<INTERVAL_SIZE; i++)
{
if (s < e)
{
if (i >= s && i <= e)
{
sb.append(c);
}
else
{
sb.append(".");
}
}
else
{
if (i <= e || i >= s)
{
sb.append(c);
}
else
{
sb.append(".");
}
}
}
return sb.toString();
}
public static long findOverlappingInterval(
long s0, long e0, long s1, long e1)
{
return compute(s0, e0+1, s1, e1+1);
}
public static long compute(
long s0, long e0, long s1, long e1)
{
if (s0 > e0)
{
return
compute(s0, INTERVAL_SIZE, s1, e1) +
compute(0, e0, s1, e1);
}
if (s1 > e1)
{
return
compute(s0, e0, s1, INTERVAL_SIZE) +
compute(s0, e0, 0, e1);
}
return Math.max(0, Math.min(e0, e1) - Math.max(s0, s1));
}
}
I primi due casi di test sono quelli che hanno è stata data nella domanda e stampa correttamente 12
e 4
, rispettivamente. I due rimanenti sono test utilizzati in altre configurazioni di sovrapposizione:
......AAAAAAAAAAAAAAAAAA
..BBBBBBBBBBBBBBBB......
12
AAAAAAAAAAAAA...........
BBB.........BBBBBBBBBBBB
4
AAAAA......AAAAAAAAAAAAA
BBBB........BBBBBBBBBBBB
16
AAAAA.......AAAAAAAAAAAA
BBBB.......BBBBBBBBBBBBB
16
Tuttavia, si noti che ulteriori configurazioni di test possono essere creati per coprire tutti i casi possibili.
Nel secondo esempio, come è l'intervallo interrotto? Come lo rappresenteresti in startTime e endTime? –
@RahulJain 'startTime = 12',' endTime = 2'. è un mondo ciclico. – Daniel
Ho cercato di inserire il codice per te ma StackOverflow mi avvisa che il rientro non è corretto –