前言

    第一层循环 0 到 len-1,当i为0,第二层循环j为 i+1即1 到 len-1,依次判断是否 num[i] 和 num[j] 相等,如果相等则进入第三次循环,k为 j+1 到 len-1,将重复点 j 后面的所有元素都往前移动 1,并将数组长度 len - 1,j 也 -1(判断向前移动的元素们的第一位,也就是移动后在 j 位上的这个元素,是否还相等。因为 循环已经到了 j,如果 j不减1,则会跳过刚刚向前移动的元素,可能导致忽略的元素仍然重复),我将在结尾展示有无 j-1的效果。

正着来

#include <stdio.h>

int main()
{
	int len = 10;
	int i = 0, j = 0, k = 0;
	int num[len];

	printf("before:");
	for(i=0; i<len; i++)
	{
		num[i] = (5 * i) % 10 + i;
		printf("%d ", num[i]);
	}
	printf("\n");
	
	for(i=0; i<len; i++)    //冒泡循环
	{
		for(j=i+1; j<len; j++)//从i后的一个元素一直往len-1位置寻找
		{
			if(num[j] == num[i])    //如果发现重复
			{
				for(k=j+1; k<len; k++)//j+1的位置到len-1的位置
				{
					num[k-1] = num[k];    //将后面的数依次赋值给前一个位置
				}
				len--;    //数组长度-1
				j--;    //重复点再次进行查重
			}
		}
	}

	printf("after: ");
	for(i=0; i<len; i++)
	{
		printf("%d ", num[i]);
	}
	printf("\n");

	return 0;
}

c/c++ 去除数组中重复的元素_i++

倒着来找重复元素

for(i=0; i<len; i++)    //冒泡循环
	{
		for(j=len-1; j>i; j--)
		{
			if(num[j] == num[i])    //如果发现重复
			{
				if(j == len-1)    //如果是最后一个位置,直接len-1,继续循环
				{
					len--;
					continue;
				}
				for(k=j+1; k<len; k++)
				{
					num[k-1] = num[k];    //将后面的数依次赋值给前一个位置
				}
				len--;    //数组长度-1
			}
		}
	}

c/c++ 去除数组中重复的元素_C++_02

j - 1 的有无

#include <stdio.h>

void yes(void);
void no(void);

int main()
{
	yes();
	no();

	return 0;
}

void yes(void)
{
	printf("****** yes ******\n");

	int len = 10;
	int i = 0, j = 0, k = 0;
	int num[len];

	printf("before:");
	for(i=0; i<len; i++)
	{
		num[i] = (4 * i) / 10;
		printf("%d ", num[i]);
	}
	printf("\n");
	
	for(i=0; i<len; i++)    //冒泡循环
	{
		for(j=i+1; j<len; j++)//从i后的一个元素一直往len-1位置寻找
		{
			if(num[j] == num[i])    //如果发现重复
			{
				for(k=j+1; k<len; k++)//j+1的位置到len-1的位置
				{
					num[k-1] = num[k];    //将后面的数依次赋值给前一个位置
				}
				len--;    //数组长度-1
				j--;    //重复点再次进行查重
			}
		}
	}

	printf("after: ");
	for(i=0; i<len; i++)
	{
		printf("%d ", num[i]);
	}
	printf("\n");
}

void no(void)
{
	printf("****** no ******\n");

	int len = 10;
	int i = 0, j = 0, k = 0;
	int num[len];

	printf("before:");
	for(i=0; i<len; i++)
	{
		num[i] = (4 * i) / 10;
		printf("%d ", num[i]);
	}
	printf("\n");
	
	for(i=0; i<len; i++)    //冒泡循环
	{
		for(j=i+1; j<len; j++)//从i后的一个元素一直往len-1位置寻找
		{
			if(num[j] == num[i])    //如果发现重复
			{
				for(k=j+1; k<len; k++)//j+1的位置到len-1的位置
				{
					num[k-1] = num[k];    //将后面的数依次赋值给前一个位置
				}
				len--;    //数组长度-1
				//j--;    //重复点再次进行查重
			}
		}
	}

	printf("after: ");
	for(i=0; i<len; i++)
	{
		printf("%d ", num[i]);
	}
	printf("\n");
}

c/c++ 去除数组中重复的元素_C++_03