前言
第一层循环 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;
}
倒着来找重复元素
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
}
}
}
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");
}