我正在尝试编写一个名为slice的函数,该函数接受一个数组和两个数字。
函数应该返回一个新数组,其元素从第一个数字的索引开始,一直到第二个数字的索引为止。
如果没有将第三个参数传递给该函数,则默认情况下应将其切片直到数组的末尾。
如果第三个参数大于数组的长度,则应切片直到数组的末尾。
function slice(s, n, m) {
let a = [];
a = s.splice(n, m);
if(m === undefined || m > s.length) {
a = s.splice(n, s.length);
}
return a;
}
let s = [1, 2, 3, 4, 5];
slice(s, 1, 7);
output []
UPDATE:
感谢大家的帮助;我知道了!!! 快乐的舞蹈
function slice(arr, start, end) {
let result = [];
from = Math.max(start, 0);
to = Math.min(end);
if((!end) || (end > arr.length)) {
for(let i = from; i<arr.length; i++) {
result.push(arr[i]);}
} else {
for(let i = from; i<to; i++) {
result.push(arr[i]);
}
}
return result;
}
slice([1, 2, 3, 4, 5], 2, 4);
主要问题是.splice
mutates数组,因此,在您第一次调用它时,您将删除该数组的一部分(或者您的情况是整个数组)。因此,如果代码输入if,并且您再次调用.splice
,则该数组已经为空。 if / else将起作用,以便.splice
仅被调用一次。
但是但这仍然不会复制.slice
的行为,因为.slice
会不变异原始数组。因此,您需要一个循环,该循环将一个元素复制到另一个元素之后:
// if "do" doesn't get passed, initialize with array.length (default parameter)
function slice(array, from, to = array.length) {
// make sure the bounds are within the range
from = Math.max(from, 0);
to = Math.min(to, array.length);
// initialize an array we can copy values into
const result = [];
for(let index = from; index < to; index++) {
// left as an exercise :)
}
return result;
}
自从OP说完作业时间以来回答了这个问题。
解决此问题的一种方法是具有指向第二和第三个参数的两个指针。如果提供了所有参数,则应从此开始]
start = n
end = m
// if m is greater than length of s or if m is not given
if(m == undefined || m > s.length()){
end = s.length() - 1;
}
然后,这是一个简单的for循环,从头到尾,包括两端。
int[] result = new int[end-start+1];
for(int i = start; i <= end; i++){
result[j] = s[i];
}
代码在语法上可能不是正确的,但是您可以解决这个问题。