我必须在Java中编写一个方法,其中输入数组a
和数字x
返回一个元素数组,这些元素跟随最后一次出现的x
in a
。
例如,对于输入{0,1,2,3,4,5,6,7,8,9}
和x=6
,该方法必须返回{7,8,9}
,同时{4,1,4,2}
和x=4
该方法必须返回{2}
并且如果x
不在a
中,那么它必须返回空数组{}
(或长度为0的数组)
所以我得到了这个答案:
int idx = -1;
for (int i = 0; i < s.length; i++) {
if (s[i] == x)
idx = i;
}
/* After you found this index, create a new array starting
* from this element. It can be done with a second (not nested) for loop, or you can
* use Arrays.copyOfRange()
*/
//make sure idx != -1
int[] t = new int[s.length - idx - 1];
for (int i = idx + 1; i < s.length; i++)
t[i - idx - 1] = s[i];
这非常有帮助,但我无法理解为什么这样有效:(已编辑;好了,现在我明白为什么会这样有效,但即使在我看来,组合for循环ideea的阅读也不那么复杂)
t[i - idx - 1] = s[i];
并且没有:
int[] t = new int[a.length - indx - 1];
for (int j = indx + 1; j < a.length; j++) {
for (int i = 0; i < t.length; i++) {
t[i]=a[j];
}
}
return t;
已编辑: 澄清这是所有代码
int[] dopoX(int[] a, int x) {
int n = a.length;
int[] c = new int[0];
int indx = 0;
int nrx = 0;
for (int j = 0; j < a.length; j++) {
if (a[j] == x)
nrx++;
if (a[j] == x)
indx=j;
}
if (nrx == 0)
return c;
int[] t = new int[n - indx - 1];
for (int j = indx + 1; j < n; j++) {
for (int i = 0; i < t.length; i++) {
t[i] = a[j]; /* it returns just 1 number of a[] like t{2,2,2,2,2,2,2,2} which is
not correct */
}
}
return t;
}
答案 0 :(得分:1)
您希望复制所有剩余的值,并创建索引t
的数组。因此,您需要从i=0
开始。但是,您可以执行 shift-operation :在某处增加i
,当您使用它时,将其移回,所以:
for (int i = idx+1; i < s.length; i++)
t[i-idx-1] = s[i];
等同于:
for (int i = 0; i < t.length; i++)
t[i] = s[i+idx+1];
(这本来也更具可读性)
关于您的第二个问题:
这里使用nested loop:第二个for
循环将在第一个循环的每次迭代中重复。
结果是,在第二个for
- 循环中,j
始终是固定的,在第一次迭代中输入{1,2,...,9}
和6
,您将填充包含7
s,下一个8
和最后9
s。
但是,您可以使用组合for
循环:
int []t=new int[n-indx-1];
// /-- grouped initializers /-- grouped increments
// | |
for(int i=0, j= indx+1; i < t.length; i++, j++){
t[i]=a[j];
}
return t;
答案 1 :(得分:1)
第一行代码查找数组内部的最后一个x索引。
第二行使用Arrays的内置函数将范围从数组复制到新副本。
我们从最后一个x之后的值复制到数组a的长度。
可以重写第一行,以便在数组中从末尾向后搜索并中断。这将提高性能,但使代码不易阅读。
for(int i=0; i<a.length;i++) if(a[i]==x) idx=i;
int[] b = Arrays.copyRangeTo(a, idx+1, a.length);
答案 2 :(得分:1)
我们假设您采用a[] = {1,2,3,4,5,6,7,8,9}
和x = 6
的情况。
运行这个:
int idx = -1;
for (int i = 0; i < s.length; i++) {
if (s[i] == x) idx = i;
}
idx = 5
为s[5] == x
。
现在我们要将最后一个x
实例后的数组复制到新数组t[]
。
显然,您必须从索引idx + 1
开始,因为idx
包含x
的最后一次出现。
因此,这段代码:
int[] t = new int[s.length - idx - 1];
for (int i = idx+1; i < s.length; i++)
t[i-idx-1] = s[i];
你在这做什么?
您构建了一个长度为t[]
的新数组s.length - idx - 1
,在我们的案例s.length = 9
和idx = 5
中,我们将s.length - idx - 1
设为3
我们可以检查x = 6
之后的元素数量。
现在,我们从i
(上面解释的原因)到idx + 1
s.length
我们t[i - idx - 1]
因为i = idx + 1
,i - idx - 1 = 0
。因此,当i
增加时,您的i - idx - 1
也会增加。
希望它有说服力。如果您仍有任何疑问,请发表评论。
答案 3 :(得分:0)
试试这个:
int j=0;
int i=idx+1;
while (j<t.length) {
t[j] = s[i];
j++;
i++;
}