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;
}