此方法用于将元素toAdd作为数组arr的新第一个元素插入,将所有当前元素移位以创建空间。数组的原始最后一个元素将丢失。该方法没有返回值,如果数组没有元素,它应该没有效果。
public static void insert(int[] arr, int toAdd){
if(arr.length > 0) {
for(int i = arr.length - 1; i > 0; --i) {
arr[i] = arr[i - 1];
}
arr[0] = toAdd;
}
}
我理解if(arr.length> 0)这一部分可以保证我们正在使用至少包含1个元素的数组。其余的逻辑让我感到困惑。为什么设置i = arr.length,为什么a - 1之后呢?为什么我> 0?和--i?
谢谢
答案 0 :(得分:2)
您正在将数组从最后一个元素浏览到第一个元素,同时将每个元素移动一个元素。例如,当i = 3时,我们将元素2移动到位置3。
但这种方法不起作用。正确的版本是:
public static void insert(int[] arr, int toAdd){
if(arr.length > 0) {
for(int i = arr.length - 1; i > 0; i--) {
arr[i] = arr[i - 1];
}
arr[0] = toAdd;
}
}
--i
在i
使用之前降低i--
的值,因此i
或arr.length
应该从import { Injectable } from '@angular/core';
@Injectable()
export class DateService {
constructor() {
}
public static parseDate(dateString: string): Date {
if (dateString) {
return new Date(dateString);
} else {
return null;
}
}
}
开始,否则您将无法移动最后一个元素。
答案 1 :(得分:0)
为什么设置i = arr.length和--i?
它是i = arr.length-1
,这是数组的最后一个索引。你必须开始向后循环移动元素(--i
,i--
也没问题),否则你可以在移动它们之前重写元素。
为什么我> 0?
arr[0] = toAdd;
应该在循环之外,并且arr.length == 0
会失败。
您可以简化为:
public static void insert(int[] arr, int toAdd){
if(arr.length > 0) {
for(int i = arr.length - 1; i > 0; --i)
arr[i] = arr[i - 1];
arr[0] = toAdd;
}
}
答案 2 :(得分:0)
arr.length
将返回数组中的元素数。如果你有一个包含索引0,1和2的元素的数组,它将返回“3”。问题是数组索引包含0,所以你需要从长度中减去1来获得数组中最后一个元素的有效索引。 (即3 - 1 = 2和2是最后一个元素的真实索引)
循环使用i > 0
,因为索引i
正在被' - i'递减(即i = i -1)。因此循环从数组中的最高元素(长度-1)开始,并向下计数到最低(索引0)。
最后,将toAdd
分配给0的行应该在for循环之外。