南邮ACM 1014 数据的插入与删除 JAVA解法

数据的插入与删除

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:1286            测试通过:251

描述

在一组数据(数目不超过10000)中,插入新数,删除所有与给定数相等的数据。

输入

第一行是未排序的一组非负整数,数目不超过10000。以-1作为结束标志。

第二行是要插入的数。

第三行是要删除的数。

输出

第一行输出自小到大排好序的数。如果没有元素,输出“No elements.”(不包括引号)。

第二行输出插入后自小到大排好序的数,以“,”隔开。

第三行输出删除后自小到大排好序的数,以“,”隔开。如果没有元素,输出“No elements.”(不包括引号)。

样例输入

100 98 79 63 44 99 -1
88
79

样例输出

44,63,79,98,99,100
44,63,79,88,98,99,100
44,63,88,98,99,100

提示

 

题目来源

GUOJ


这道题其实不是很难,但是我最后用java做还是没有完成。总是报“这段代码专门报Memory Limit Exceed”错误。以下是我写的代码。

package yx.njuptacm;

import java.util.Arrays;
import java.util.Scanner;

public class ACM1014 {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int[] arr=new int[10001];
		int n=0;
		while(true){
			int a=sc.nextInt();
			if(a==-1){
				break;
			}
			arr[n++]=a;
		}
		int insertNum=sc.nextInt();
		int deleteNum=sc.nextInt();
		sort(arr,n);
		insert(arr,n,insertNum);
		delete(arr,n+1,deleteNum);
	}

	private static void delete(int[] arr, int n,int deleteNum) {
		/*int index=-1;
		for(int i=0;i<n;i++){
			if(arr[i]==deleteNum){
				index=i;
			}
		}
		if(index!=-1){//有可以删除的元素
			if(n==1){
				System.out.println("No elements.");
				return;
			}
			for(int i=index;i<n;i++){
				arr[i]=arr[i+1];
			}
			n--;
		}*/
		for(int i=0;i<n;i++){
			if(deleteNum<=arr[i]){
				arr[i]=arr[i+1];
			}
		}
		n--;
		for(int i=0;i<n-1;i++){
			System.out.print(arr[i]+",");
		}
		System.out.println(arr[n-1]);
	}

	private static void insert(int[] arr, int n,int insertNum) {
		//int index=0;//用来记录应该插入的位置
		/*for(int i=0;i<n;i++){
			if(insertNum<arr[i]){
				index=i;
				break;
			}
		}*/
		for(int i=n-1;i>=0;i--){
			if(insertNum<arr[i]){
				arr[i+1]=arr[i];
			}else{
				arr[i+1]=insertNum;
				break;
			}
				
		}
		//arr[index]=insertNum;
		n++;
		for(int i=0;i<n-1;i++){
			System.out.print(arr[i]+",");
		}
		System.out.println(arr[n-1]);
	}

	private static void sort(int[] arr,int n) {
		if(n==0){
			System.out.println("No elements.");
			return;
		}
		//Arrays.sort(arr,0,n);
		int temp,j;
		for(int i=1;i<n;i++){//这里使用了插入排序
			temp=arr[i];
			j=i-1;
			while(j>=0&&temp<arr[j]){
				arr[j+1]=arr[j];
				j--;
			}
			arr[j+1]=temp;
		}
		for(int i=0;i<n-1;i++){
			System.out.print(arr[i]+",");
		}
		System.out.println(arr[n-1]);
	}

}


后来在http://www.cnblogs.com/Rosanna/p/3436508.html     这段C++代码通过运行

#include<iostream>
using namespace std;
int main()
{
    int m=0,i,j,jia,jian,temp,str[10001];
    while(cin>>str[m]&&str[m]!=-1)
    {m++;}
    cin>>jia>>jian;
    str[m]=jia;
    for(j=m-2;j>=0;j--)
    {
        for(i=0;i<=j;i++)
        {
            if(str[i]>str[i+1])
            {
                temp=str[i];
                str[i]=str[i+1];
                str[i+1]=temp;
            }
        }
    }
    if(m==0)
        cout<<"No elements."<<endl;
    else{
    for(i=0;i<=m-2;i++)
    {
        cout<<str[i]<<',';
    }
    cout<<str[m-1]<<endl;
    }
 
    for(j=m-1;j>=0;j--)
    {
        for(i=0;i<=j;i++)
        {
            if(str[i]>str[i+1])
            {
                temp=str[i];
                str[i]=str[i+1];
                str[i+1]=temp;
            }
        }
    }
     
    for(i=0;i<=m-1;i++)
    {
        cout<<str[i]<<',';
    }
    cout<<str[m]<<endl;
     
    for(i=0;i<=m;i++)
    {
        if(str[i]==jian)
        {
            for(j=i;j<=m-1;j++)
            {
                str[j]=str[j+1];
            }
            m=m-1;
            i=i-1;
        }
    }
 
    if(m==-1)
    {
        cout<<"No elements."<<endl;
    }
    else
    if(m==0)
    {
        cout<<str[m]<<endl;
    }
    else{
    for(i=0;i<=m-1;i++)
    {
        cout<<str[i]<<',';
    }
    cout<<str[m]<<endl;}
    return 0;
} 

所以我就按照他的算法,使用java语言重写了一次。

package yx.njuptacm;

import java.util.Scanner;

public class ACM1014FormNet {

	
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int m=0,i,j,jia,jian,temp;
		int[] arr=new int[10001];
		while(sc.hasNextInt()){
			int a=sc.nextInt();
			if(a==-1){
				break;
			}
			arr[m++]=a;
		}
		jia=sc.nextInt();
		jian=sc.nextInt();
		arr[m]=jia;
		for(j=m-2;j>=0;j--){//冒泡排序
			for(i=0;i<=j;i++){
				if(arr[i]>arr[i+1]){
					temp=arr[i];
					arr[i]=arr[i+1];
					arr[i+1]=temp;
				}
			}
		}
		if(m==0)
			System.out.println("No elements.");
		else{
			for(i=0;i<=m-2;i++){
				System.out.print(arr[i]+",");
			}
			System.out.println(arr[m-1]);
		}
		
		for(j=m-1;j>=0;j--){//插入一值后的冒泡排序
			for(i=0;i<=j;i++){
				if(arr[i]>arr[i+1]){
					temp=arr[i];
					arr[i]=arr[i+1];
					arr[i+1]=temp;
				}
			}
		}
		
		for(i=0;i<=m-1;i++){
			System.out.print(arr[i]+",");
		}
		System.out.println(arr[m]);
		
		for(i=0;i<=m;i++){
			if(arr[i]==jian){//删除一个数
				for(j=i;j<=m-1;j++){
					arr[j]=arr[j+1];
				}
				m--;
			}
		}
		
		if(m==-1){
			System.out.println("No elements.");
		}else if(m==0){
			System.out.println(arr[m]);
		}else{
			for(i=0;i<=m-1;i++){
				System.out.print(arr[i]+",");
			}
			System.out.println(arr[m]);
		}
		
	}

}

还是报“Memory Limit Exceed”,不知道这是为什么???

大家有时知道的可以告诉我。

你可能感兴趣的:(南邮ACM 1014 数据的插入与删除 JAVA解法)