0、题目简介
序列中删除指定数字_牛客题霸_牛客网 (nowcoder.com)
第一个整数代表序列的长度,第二个输入是一个数组,第三个输入是我们要删除的数字。如果数组中有多个该数字要一起删除。
1、思路1
直接法:找到它,删除它,把它后面的元素前移。
#include <stdio.h>
int main()
{
//初始化输入
int len = 0;
int arr[50] = { 0 };
int k = 0;
scanf("%d", &len);
int i = 0;
for (i = 0; i < len; i++)
{
scanf("%d", &arr[i]);
}
scanf("%d", &k);
//遍历数组arr
for (i = 0; i < len; i++)
{
while (arr[i] == k)
{
//最好不要乱改动下标i, 因为后面还需要继续遍历
int j = i;
while (j < len - 1)
{
arr[j] = arr[j + 1];
j++;
}
len--;
i--; //如果你成功删除了一个元素, 数组下标应该返回上一个
break;
}
}
//打印删除后的数组
for (i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
2、思路2
空间换时间,把我需要的数据在brr里存起来,打印brr
#include<stdio.h>
int main()
{
//初始化输入
int len = 0;
scanf("%d", &len);
int arr[50] = { 0 };
int brr[50] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < len; i++)
{
scanf("%d", &arr[i]);
}
int k = 0;
scanf("%d", &k);
//当arr里面的元素不是k, 就是我需要的元素, 存到brr里
for (i = 0; i < len; i++)
{
if (arr[i] != k)
{
brr[j] = arr[i];
j++;
}
}
//打印brr, j经过遍历之后为brr的长度, 存一个j就+1
for (i = 0; i < j; i++)
{
printf("%d ", brr[i]);
}
return 0;
}
3、思路3
变为0,跳过0,当我们跟着题面走,去直接删除操作的时候就注定找不到最优解了,跳过这个元素不也达到了删除的效果吗?而除了直接改0的做法外,还可以利用位操作符里的 异或
^ 异或 : “异”在第“一”个字的位置,所以两个二进制 相异 置为 1
性质:a ^ a == 0
0 ^ b == b
a ^ b ^ a == a ^ a ^ b == b
#include<stdio.h>
int main()
{
//初始化输入
int len = 0;
scanf("%d", &len);
int arr[50] = { 0 };
int i = 0;
for (i = 0; i < len; i++)
{
scanf("%d", &arr[i]);
}
int k = 0;
scanf("%d", &k);
//与k相同的元素会被置为0
for (i = 0; i < len; i++)
{
arr[i] ^= k;
}
//^k还原之前与k不同的元素
for (i = 0; i < len; i++)
{
if (arr[i] != 0)
{
printf("%d ", arr[i] ^ k);
}
}
return 0;
}