Day_4

1、集合的交集

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

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

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

输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5

用python写了之后,在最后一个测试点(大规模数据)会出现内存超限。

a = [int(i) for i in input().split()]
b = [int(i) for i in input().split()]
num = []
if(len(a) == 0) or (len(b)==0):
    print("NULL")
else:
    for i in a[:len(a)-1]:
        for j in b[:len(b)-1]:
            if i == j:
                num.append(i)
                break
    l = len(num)
    if l == 0:
        print("NULL")
    else:
        for i in num[:l-1]:
            print(i,end=" ")
        print(num[l-1])

参考了链表,可以解决这个问题:

#include<iostream>
using namespace std;

typedef struct Node{
    int data;
    struct Node *next;
}*List;


void Creat(List &L){
    L = new Node;
    L->next = NULL;
    List p,q;
    p = L;
    int x;
    while(cin >> x && x != -1){
        q = new Node;
        q->data = x;
        q->next = NULL;
        p->next = q;
        p = p->next;
    }
    p->next = NULL;
}


List Merge(List &La,List &Lb)
{
    List Lc;
    List pa,pb,pc;
    Lc = pc = La;
    pa = La->next;
    pb = Lb->next;
    while(pa && pb){
        if(pa->data < pb->data)
            pa = pa->next;
        else if(pb->data < pa->data)
            pb = pb->next;
        else{
            pc->next = pa;
            pc = pa;
            pa = pa->next;
            pb = pb->next;
        }
    }
    pc->next = NULL;
    return Lc;
}



void print(List L){
    List p;
    p = L->next;
    if(L->next == NULL)
        cout<<"NULL";
    else{
        while(p->next){
            cout<< p->data <<" ";
            p = p->next;
        }
        cout << p->data;
    }
}


int main(){
    List la,lb,lc;
    Creat(la);
    Creat(lb);
    print(Merge(la,lb));
}

2、最长对称子串

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。

输入格式:
输入在一行中给出长度不超过1000的非空字符串。

输出格式:
在一行中输出最长对称子串的长度。

输入样例:
Is PAT&TAP symmetric?
输出样例:
11

#include<iostream>
#include<string>
using namespace std;
int m1,m2 = 1;


bool OL(string s,int i,int j){
	
	int slen = s.length()-1; 

	if(i < 0 || j > slen)
		return false;
	if(s[i] == s[j]){
		m1 += 2;
		OL(s,i-1,j+1);
	}else{
		return false;
	}
	return true;
}

bool JL(string s,int i,int j){
	
	int slen = s.length()-1; 

	if(i < 0 || j > slen)
		return false;
	if(s[i] == s[j]){
		m2 += 2;
		JL(s,i-1,j+1);
	}else{
		return false;
	}
}


int main(){
	string s;
	int i,j;
	int maxl1 = -1,maxl2 = -1;
	
	getline(cin,s);
	int len = s.length();
	
	if(len == 1){
		cout << 1 << endl;
		return 0;
	}

	for(i = 0; i < len; i++){
		m1 = 0;
		OL(s,i,i+1);
		maxl1 = max(maxl1,m1);
	}

	for(i = 1; i < len-1; i++){
		m2 = 1;
		JL(s,i-1,i+1);
		maxl2 = max(maxl2,m2);
	}
	cout << max(maxl1,maxl2) << endl;
	return 0;
}

第一个代码有一个点会超时,改为下面的方法:

#include<iostream>
using namespace std;
int main() {
	string s;
	int i,j;
	getline(cin,s);
	int m = 1;
	int len = s.length();
	for(i = 0; i < len; i++){
		j = 1; 
		while(i-j >= 0 && i+j < len && s[i-j] == s[i+j]) 
			j++;
		j--;
		if(j*2 + 1 > m) 
			m = j * 2 + 1;
		j = 1;
		
		while(i-j+1 >= 0 && i+j < len && s[i-j+1] == s[i+j]) 
			j++; 
		j--;
		if(j*2 > m)
			m = j*2;
	} 
  	cout<<m;
   return 0;
}

还有一个小问题要注意的就是,整个字符串输入时要用getline(),前几次我在输入字符串的时候用的是cin(会自动过滤掉不可见字符(如空格 回车 tab等)),所以测试样例结果一直为0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值