+---+---+---+---+---+ | H | e | l | p | A | +---+---+---+---+---+ 0 1 2 3 4 5 -6 -5 -4 -3 -2 -1
python slice style:
- start index is included, end index is excluded
- no start, end index values or -ve start, end index values can be specified, -ve and +ve start, end index values can be specified
- for invalid inputs, handle gracefully (especially end index value)
- for +ve step, traverse forward; for -ve step, traverse backward
- for step > 0, defaults are start = 0, end = array.length (5)
- for step < 0, defaults are start = -1, end = -array.length-1 (-6)
// +---+---+---+---+---+ // | H | e | l | p | A | // +---+---+---+---+---+ // 0 1 2 3 4 5 // -6 -5 -4 -3 -2 -1 int[] slice(int[] a, int? START, int? END, int step): if a == null : return empty if step == 0 : return empty else if step > 0 : start = 0 end = a.length else // step < 0 start = -1 end = -a.length -1 start = START ?? start end = END ?? end if start < -a.length || start >= a.length : return empty if end < -a.length -1 : end = -a.length -1 if end > a.length : end = a.length start = toPositiveIndex(start, a.length) end = toPositiveIndex(end, a.length) if step > 0 && start > end : return empty if step < 0 && start < end : return empty slicelength = ceiling(end - start / step) for (i = start; (step > 0 ? i < end : i > end); i += step) slice[j++] = a[i] return slice int toPositiveIndex(int index, int length): return index >= 0 ? index : index + length
tests:
s e step slice ------------------------------- 0 5 1 {HelpA} ? ? 1 {HelpA} 0 ? 1 {HelpA} ? 5 1 {HelpA} 0 >5 1 {HelpA} -5 5 1 {HelpA} 0 1 1 {H} -3 5 1 {lpA} 0 0 1 {} 1 0 1 {} ? ? 2 {HlA} ? ? -1 {ApleH} ? -6 -1 {ApleH} -1 ? -1 {ApleH} -1 -6 -1 {ApleH} -1 <-6 -1 {ApleH} 4 -6 -1 {ApleH} 0 -6 -1 {H} 0 0 -1 {} 0 1 -1 {} ? ? -2 {AlH}
No comments:
Post a Comment