我想了解我正在从geeksfogeeks学习的代码中的特定行。这是主要代码:
class Main
{
// Function to remove duplicate elements
// This function returns new size of modified
// array.
static int removeDuplicates(int arr[], int n)
{
// Return, if array is empty
// or contains a single element
if (n==0 || n==1)
return n;
int[] temp = new int[n];
// Start traversing elements
int j = 0;
for (int i=0; i<n-1; i++)
// If current element is not equal
// to next element then store that
// current element
if (arr[i] != arr[i+1])
temp[j++] = arr[i];
// Store the last element as whether
// it is unique or repeated, it hasn't
// stored previously
temp[j++] = arr[n-1];
// Modify original array
for (int i=0; i<j; i++)
arr[i] = temp[i];
return j;
}
public static void main (String[] args)
{
int arr[] = {1, 2, 2, 3, 4, 4, 4, 5, 5};
int n = arr.length;
n = removeDuplicates(arr, n);
// Print updated array
for (int i=0; i<n; i++)
System.out.print(arr[i]+" ");
}
}
如果我正确地理解了这段代码,它正在做的是迭代初始给定数组并比较数组的下一个元素是否具有相同的值。如果不是,那么它将“unique”元素添加到temp数组中,然后使用j的值(根据有多少独特元素增加值)来重写原始数组。
我没有得到的是这一行
temp[j++] = arr[n-1];
这条线的目的是什么?我知道它增加了J的值,但“n-1”并没有多大意义。
我很感激有关这个主题的任何见解,并提前感谢你...好时光。
答案 0 :(得分:1)
删除数组中的重复元素
您的程序不会从阵列中删除重复项。如果它们是连续的,它只会删除它们。例如。 {1,2,2,3}变为{1,2,3}但{1,2,3,2}仍为{1,2,3,2}。但是,如果输入数组已排序,则然后将删除所有重复项。请注意,在{1,2,2,3} 第二中,第二个数字被添加到temp []。 (意味着只有相同数字序列中的最后数字被添加到temp [])。
static int removeDuplicates(int arr [],int n)
您不需要调用者传递数组的大小。在Java中,数组是提供名为length
的属性的特殊对象。所以你可以像int n = arr.length;
那样找出长度。您需要以C语言而不是Java语言传递数组大小。
我没有得到的是这一行
temp [j ++] = arr [n-1];
检查此语句上方for
循环的条件。
for (int i=0; i<n-1; i++)
如您所见,它仅在i
小于n-1
之前运行。在英语单词中,您运行此循环直到第二个最后一个元素。这是因为在for
循环中,您将第i个元素与第i + 1个元素进行比较。这样,在最后一次迭代中,您将第二个最后一个元素与最后一个元素进行比较。你不能走得更远,因为在最后一个元素之后什么也没有。但是,使用此方法,您将不会添加temp
数组中的最后一个元素。所以你必须编写一行额外的代码来在循环结束后添加最后一个元素。
答案 1 :(得分:1)
temp[j++] = arr[n-1]
是必需的。
For循环正在迭代,直到i小于n-1。
如果数组的大小为4,例如array:{1, 2, 3, 4}
n-1
=索引3无法与索引4(arr[i+1]
)
这可以防止for循环超出范围。
由于最后一个元素未添加到临时数组,
将最后一个元素添加到临时数组需要temp[j++] = arr[n-1]
。