因此,我应该编写一个删除重复项的函数,并且很难理解某一行。
void repeat(char arr[], int times[],int &arraySize)
{
{
for(int i = 0; i<arraySize; i++)
{
for(int j =i+1; j<arraySize; j++)
{
if(arr[i]==arr[j])
{
for(int c = j; c < arraySize-1; c++){
arr[c] = arr[c+1];
}
arraySize--;
}
}
}
}
}
***for(int c = j; c < arraySize-1; c++){
arr[c] = arr[c+1];***
这些行是否一直循环到数组的最后一个元素?关于arr [c] = arr [c + 1]也有些困惑;我们为什么需要那个?
答案 0 :(得分:0)
要删除数组中的元素(无论是否重复-无关紧要),您必须将所有其余元素向下移动一个位置,以覆盖要删除的元素。当我们说“移动”时,我们实际上是指“复制”。
因此,您看到的循环将j
到arraySize - 1
中的每个元素替换为紧随其后的元素。最后一个元素不需要替换,实际上也不需要替换,因为语句arraySize--;
确保不再考虑该元素。
(另外,如果您考虑过,如果要替换,将用什么替换?在位置[arraySize]
上没有元素!C ++数组从零开始索引,因此有效元素为从[0]
到[arraySize - 1]
。)