首页 > 试题广场 >

序列中删除指定数字

[编程题]序列中删除指定数字
  • 热度指数:52749 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。

数据范围:序列长度和序列中的值都满足

输入描述:

第一行输入一个整数(0≤N≤50)。

第二行输入N个整数,输入用空格分隔的N个整数。

第三行输入想要进行删除的一个整数。



输出描述:
输出为一行,删除指定数字之后的序列。
示例1

输入

6
1 2 3 4 5 9
4

输出

1 2 3 5 9
示例2

输入

5
1 2 3 4 6
5

输出

1 2 3 4 6
好多人考打印的时候判断是这个数就不打印,其实这是钻空子,本质上并没有除去数组里的元素,只是不打印罢了
#include<stdio.h>
int main()
{
    int N = 0,arr[50] = {0},num = 0,count = 0;
    scanf("%d",&N);
    for(int i = 0;i < N;i++)
        scanf("%d",&arr[i]);
    scanf("%d",&num);
    for(int i = 0;i < N - count;i++){
        if(arr[i] == num){
            for(int j = i;j < N - count - 1;j++)
                arr[j] = arr[j + 1];
            count++;
            i--;
        }
    }
    for(int i = 0;i < N - count;i++)
        printf("%d ",arr[i]);
    return 0;
}

发表于 2022-07-31 21:05:47 回复(0)
a = int(input())
lis = list(map(int,input().split(' ')))
b = int(input())
count = lis.count(b)
for i in range(0,count):
    lis.remove(b)
for i in lis:
    print(i,end=' ')
发表于 2022-05-21 22:26:33 回复(0)
#include<stdio.h>

int main()
{
    int N;
    scanf("%d",&N);
    int arr[N];
    for(int i=0;i<N;i++){
        scanf("%d",&arr[i]);
    }
    int x;
    scanf("%d",&x);
    for(int i=0;i<N;i++){
        if(arr[i]!=x){
            printf("%d ",arr[i]);
        }
    }
    return 0;
}

发表于 2021-08-27 23:22:27 回复(0)
N = int(input())
ln = list(map(int, input().split()))
de_N = int(input())
count = ln.count(de_N)
for i in range(count):
    ln.remove(de_N)
print(*ln)

发表于 2021-08-25 15:03:38 回复(0)
思路1:创建额外列表并且赋值与初始列表一致,判断待删除数值与初始列表中的值是否相同,相同则在额外列表中删去对应的值,注意维护额外列表的长度;
n = int( input() )
num_list = [ int(x) for x in input().split() ]
del_num = int( input() )

new_list = num_list[:]
m = 0
for i in range( n ):
    if num_list[i] == del_num:
        del new_list[i-m]
        m += 1

for j in range( len( new_list ) ):
    print( '%d '%( new_list[j] ), end='' )


思路2:不需额外列表,比较初始列表中的值与待删除值,如果相同则删去。注意循环的跳出条件。(  不知为何,此方法比前面方法慢)
n = int( input() )
num_list = [ int(x) for x in input().split() ]
del_num = int( input() )

i = 0
while i < len( num_list ): 
    if num_list[i] == del_num:
        del num_list[i]
    else:
        i += 1

for j in range( len( num_list ) ):
    print( '%d '%( num_list[j] ), end='' )


发表于 2020-03-15 16:48:53 回复(1)
#include<stdio.h>
int main(){
	int n,x,s[50];
	int i,j=0;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&s[i]);
	} 
	scanf("%d",&x);
	for(i=0;i<n;i++){
		if(s[i]!=x){//如果不是要删除的那个元素,则数组正常遍历,如果找到了,就覆盖
			s[j++]=s[i];
		}
	}
	for(i=0;i<j;i++){
		printf("%d ",s[i]);
	}
	printf("\n");
}
方法属于原地修改数组,然后输出修改后的数组长度内的元素即可,无需开新数组,节省空间。
发表于 2020-06-05 17:24:31 回复(3)
//不需要动原来的数组呀,不输出它就好了
#include<stdio.h>
int main(void)
{
    int i,n,num;
    scanf("%d",&n);
    int arr[n];
    for(i=0;i<n;i++){
        scanf("%d",&arr[i]);
    }
    scanf("%d",&num);
    for(i=0;i<n;i++){
        if(arr[i]!=num){printf("%d ",arr[i]);}
    }
}
发表于 2022-03-04 16:39:48 回复(1)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

// lambda式解法
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            List<String> list = new ArrayList<>();
            for (int i = 0; i < n; i++) {
                int temp = sc.nextInt();
                list.add(Integer.toString(temp));
            }
            String key = Integer.toString(sc.nextInt());
            //使用filter过滤掉key的元素
            list = list.stream()
                    .filter(e->!e.equals(key))
                    .collect(Collectors.toList());
            //每个list元素中间使用空格分割
            String s = list.stream().collect(Collectors.joining(" "));
            System.out.println(s);
        }
    }
}

发表于 2020-09-23 13:54:52 回复(1)
#include<stdio.h>
int main()
{
    int n = 0;
    scanf("%d",&n);
    int arr[50];
    int i = 0;
    int j = 0;
    for(i = 0;i<n;i++)
    {
        scanf("%d ",&arr[i]);
    }
    int x = 0;//要删除的一个整数
    scanf("%d ",&x);
    for(i = 0;i<n;i++)
    {
        /*if(arr[i]!=x)
        {
            printf("%d ",arr[i]);
        }*///投机取巧写法
        if(arr[i]!=x)
        {
            arr[j++] = arr[i];
        }
    }
    for(i = 0;i<j;i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}

发表于 2022-03-17 22:10:39 回复(0)
#include<stdio.h>
int main()
{
    int a=0;
    scanf("%d",&a);
    int arr[50];
    for(int i=0;i<a;i++)
    {
        scanf("%d",&arr[i]);
    }
    int del=0;//需要删除的数
    scanf("%d",&del);
    int j=0;//j属于我们构建删除数列的下标
    for(int i=0;i<a;i++)//遍历原来的数组每个数
    {
        if(arr[i]!=del)//假如不等于要删去的数,就加入数列,否则不加入
        {
            arr[j]=arr[i];
            j++;
        }
    }
for(int i=0;i<j;i++)//数组一共有j个数
{
    printf("%d ",arr[i]);
}
return 0;
}

发表于 2022-01-06 14:21:34 回复(0)
#include<stdio.h>
int main(){
    int n,x;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&x);
    for(int j=0;j<n;j++)
        if(x==a[j])
            a[j]=-1;
    for(int k=0;k<n;k++){
        if(a[k]<0)
            continue;
        printf("%d ",a[k]);
    }
    return 0;
}

发表于 2021-04-10 09:45:55 回复(1)
不需要想的太复杂。
第一步输入一个数;
第二步输入一个该数长度的数组;
第三步再输入一个需要删除的数;
第四步遍历该数组并判断与要删除的不同的数输出即可。
#include<cstdio>
(802)#include<iostream>
using namespace std;
int main() {
    int n;
    int a[51] = {0};
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    int m;
    cin >> m;
    for (int i = 0; i<n;i++) {
        if (a[i] != m) {
            cout << a[i]<<" ";
            }
        }
    return 0;
}


发表于 2020-03-24 18:52:43 回复(0)
#include <stdio.h>
int main(){
    int n, target, count_target = 0;
    int arr[50] = {0};
    scanf("%d",&n);
    for(int i = 0; i < n; i++){
        scanf("%d",&arr[i]);
    }
    scanf("%d",&target);
// 统计目标值的个数,并在遇到每个非目标值时
// 前移相应个数的距离
    for(int i = 0; i < n; i++){
        if(arr[i]  == target){
            count_target++;
        } else {
            arr[i - count_target] = arr[i];
        }
    }
    for(int i = 0; i < n - count_target; i++){
        printf("%d ",arr[i]);
    }
    return 0;
}

发表于 2022-08-19 15:43:29 回复(0)
#include <stdio.h>

void game(int n,int arr[],int m)
{
    int i = 0;
    for(i = 0;i<n;i++)
    {
        if(arr[i] != m)
        printf("%d ",arr[i]);
    }
}

int main()
{
    int n = 0;
    scanf("%d",&n);
    int arr[50] = {0};
    int i = 0;
        for(i = 0;i<n;i++)
        {
            scanf("%d",&arr[i]);//别忘加上&符号
        }
    int m = 0;
    scanf("%d",&m);
    game(n,arr,m);
    
    return 0;
}
发表于 2022-07-01 12:59:29 回复(0)
#include<stdio.h>
int main()
{   
    int a[50];
    int i,j,n,b;
        scanf("%d",&n);
     for(i=0;i<n;i++)
     {scanf("%d",&a[i]);}
    scanf("%d",&b);
    for(j=0;j<n;j++)
    {    if(b==a[j])
     {
continue;
}
   printf("%d ",a[j]) ;
}
return 0;
}
发表于 2021-12-14 17:57:26 回复(0)
#include <stdio.h>

int main() {
    int n = 0;
    scanf("%d", &n);
    int arr[10] = { 0 };
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    int m = 0;
    scanf("%d", &m);
    for (int i = 0; i < n; i++)
    {
        if(arr[i]==m)
        {
            continue;
        }
        printf("%d ", arr[i]);
    }
    return 0;
}

发表于 2024-08-10 13:57:11 回复(0)
#include <stdio.h>

int main() {
    int n = 0;
    scanf("%d", &n);
    int arr[n];//c99use
    int i = 0;
    for (i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    int del = 0;
    scanf("%d", &del);
    int j = 0;
    for (i = 0; i < n; i++) {
        if (arr[i] != del) {
            arr[j] = arr[i];
            j++;
        }
    }
    for (i = 0; i < j; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

发表于 2024-01-14 17:32:57 回复(0)
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

void Del(int* arr, int n, int k)
{
	assert(arr);
	int i = 0;
	for (i = 0; i < n; i++)
	{
		if (arr[i] == k)
		{
			continue;
		}
		printf("%d ", arr[i]);
	}
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int* arr = (int*)calloc(n, sizeof(int));
	if (arr == NULL)
	{
		perror("main -> calloc");
		return 1;
	}

	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	int k = 0;
	scanf("%d", &k);

	Del(arr, n, k);

	free(arr);
	arr = NULL;
	return 0;
}


运用动态内存开辟实现
发表于 2023-10-23 11:24:08 回复(0)
#include<stdio.h>
int main(){
    int n,m,i,j;
    scanf("%d",&n);
    int a[n];
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    scanf("%d",&m);
    for(i=0;i<n;i++){
        if(a[i]!=m){
            printf("%d ",a[i]);
        }
    }
}
发表于 2022-07-25 12:48:36 回复(0)
#include<stdio.h>
int main()
{
    int  N , a[50] , del , b[50] , sum = 0;
    scanf("%d",&N);
    for(int i = 0 ; i < N ; i++) scanf("%d",&a[i]);
    scanf("%d",&del);
    for(int i = 0 , j = 0 ; i < N ; i++ , j++)
    {
        if(a[i] != del) b[j] = a[i];
        else
        {
            j--;    
            sum++;    //记录删了几个数
        }
    }
    for(int l = 0 ; l < N - sum ; l++) printf("%d ",b[l]);
    return 0;
}

发表于 2022-06-26 14:35:35 回复(0)