(厦门大学数据结构编程实训题集)2-1 最长连续递增子序列错误的点&&2-3 两个有序链表序列的交集错误的点

1-3 减一运算

1、注意输入为1时returnsize要赋值为1,a[0]要赋值为0

给定一个由正整数组成的非空数组,也就是一个大于0的自然数N的各位数字,其中最高位数字存放在数组的首位, 且每个数组元素只存储一位数字。

本题要求实现一个函数,在N的基础上减一,返回一个新的数组。

假设除了整数 0 之外,数组的首元素不会是零。

函数接口定义:

int* MinusOne(int *digits, int digitsSize, int *returnSize)

其中 ,digits是用户传入的数组,即N的各位数字,digitsSize 是该数组的大小,即N的位数;函数返回N-1后对应的新数组,*returnSize 是该数组的大小。

注意:返回的数组必须是通过动态分配内存建立的,且由主程序负责释放。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

int *GetDigits(int *digitsSize);  /* 由裁判实现,略去不表 */
int* MinusOne(int *digits, int digitsSize, int *returnSize);

int main()
{
    int *digits, *returnDigits, digitsSize, returnSize,i;

    digits = GetDigits(&digitsSize);
    returnDigits=MinusOne(digits, digitsSize, &returnSize);
    for (i=0;i<returnSize;i++)
        {
        printf("%d ", returnDigits[i]);
    }
        printf("\n");
    free(digits);
    free(returnDigits);

    return 0;
}

int *GetDigits(int *digitsSize)
{
    int *res,i;
    char s[2001];

    if (fgets(s,2001,stdin))
    {
    }
    res=(int *)malloc(1000*sizeof(int));
    *digitsSize=0;
    for (i=0;s[i];i++)
    {
        if (s[i]>='0' && s[i]<='9')
        {
            res[(*digitsSize)++]=s[i]-'0';
        }
    }
    return res;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 0 1 9 

输出样例:

2 0 1 8 

2-1 最长连续递增子序列错误的点

1、忽略最长递增序列在最后一位,即循环退出后要再考虑一次cnt>max,更新form和last

2、last初始值的错误:忽略当只有最长长度为1时last值应该是1,所以初始值last赋为1

给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。

输入格式:

输入第1行给出正整数n(≤105);第2行给出n个整数,其间以空格分隔。

输出格式:

在一行中输出第一次出现的最长连续递增子序列,数字之间用空格分隔,序列结尾不能有多余空格。

输入样例:

15
1 9 2 5 7 3 4 6 8 0 11 15 17 17 10

输出样例:

3 4 6 8
#include <stdio.h>
#include <stdlib.h>
#define N 100005
struct LNode
{
	int*data;
	int size;
};
typedef struct LNode*List;
List CreateList()
{
	List L=(List)malloc(sizeof(struct LNode));
	L->data=(int*)malloc(sizeof(int)*N);
	//L->next=NULL;
	return L;
}
void check(List L)
{
	int max=0;
	int cnt=0;
	int form=0;
	int last=1;
	int former=0;
	for(int i=1;i<L->size;i++)
	{
		if(L->data[i]>L->data[i-1])
		{
			cnt++;
		}
		else
		{
			if(cnt>max)
			{
				form=former;
				last=i;
				max=cnt;
			}
			cnt=0;
			former=i;
		}
	}
	if(L->data[L->size-1]>L->data[L->size-2])
	{
		if(cnt>max)
		{
			form=former;
			last=L->size;
			max=cnt;
		}
	}
	for(int i=form;i<last;i++)
	{
		printf("%d",L->data[i]);
		if(i!=last-1)
		{
			printf(" ");
		}
	}
	//printf("%d %d",form,last);
}
int main()
{
	int n;
	scanf("%d",&n);
	List L=CreateList();
	L->size=n;
	for(int i=0;i<n;i++)
	{
		int data;
		scanf("%d",&data);
		L->data[i]=data;
	}
	check(L);
	return 0;
}

 2-3 两个有序链表序列的交集错误的点

1、若新链表为空,输出NULL

2、审题!!!要用链表,否则数据特别大数组存储不完的

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。

输入格式:

输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。

输出格式:

在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL

输入样例:

1 2 5 -1
2 4 5 8 10 -1

输出样例:

2 5
#include <stdio.h>
#include <stdlib.h> 
struct LNode
{
	int data;
	struct LNode*next;
	//int size;
};
typedef struct LNode*List;
List CreateList()
{
	List L=(List)malloc(sizeof(struct LNode));
	L->next=NULL;
	return L;
}
void print(List L)
{
	List p=L->next;
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
}
void check(List L1,List L2)
{
	List p1=L1->next;
	List p2=L2->next;
	List ans=CreateList();
	List p3=ans;
	while(p1&&p2)
	{
		if(p1->data==p2->data)
		{
			List next=p1->next;
			p1->next=NULL;
			p3->next=p1;
			p3=p1;
			p1=next;
			p2=p2->next;
		}
		else if(p1->data<p2->data)
		{
			p1=p1->next;
		}
		else
		{
			p2=p2->next;
		}
	}
	int isfirst=0;
	if(ans->next==NULL)
	{
		printf("NULL");
	}
	else
	{
		ans=ans->next;
		while(ans)
		{
			if(isfirst!=0)
			{
				printf(" ");
			}
			isfirst=1;
			printf("%d",ans->data);	
			ans=ans->next;		
		}
	}
	
}
int main()
{
	List L1=CreateList();
	List L2=CreateList();
	int data;
	int index1=0;
	scanf("%d",&data);
	List p1=L1;
	List p2=L2;
	while(data!=-1)
	{
		List newnode=CreateList();
		newnode->data=data;
		newnode->next=NULL;
		p1->next=newnode;
		p1=newnode;
		scanf("%d",&data);
	}
	scanf("%d",&data);
	int index2=0;
	while(data!=-1)
	{
		List newnode=CreateList();
		newnode->data=data;
		newnode->next=NULL;
		p2->next=newnode;
		p2=newnode;		
		scanf("%d",&data);
	}
	check(L1,L2);
	//print(L2);
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值